If-Abfragen und Schleifen bereiten mir graue Haare.

Sascha_77

Aktives Mitglied
Thread Starter
Dabei seit
23.10.2005
Beiträge
766
Reaktionspunkte
99
GELÖST: If-Abfragen und Schleifen bereiten mir graue Haare.

Hi Leute.

Nachdem ich gestern etliche Stunden damit verbracht habe mir ein Bash-Script zu bauen und ich es nicht 100% hinbekomme, wende ich mich jetzt vertrauensvoll an Euch. :D

Folgende Situation:
Ich habe ein Programm welches nur über eine GUI bedienbar ist (leider). Was bis jetzt funktioniert ist, das das Bash-Script solange wartet bis das Programm läuft (dank einer while-schleife) und führt dann ein Mouse-Script aus (Mauszeiger bewegt sich mittels einem externen Macro-Programm) welches einen bestimmten Button des Programms drückt. Soweit klappt das alles super.

Jetzt kommt das ABER. Jetzt muss das Script aber auch bemerken, dass das Programm durchgelaufen ist und es dann (wieder mit einem Macro für die Mouse) das Programm schließt.

Und hier liegt jetzt der Hund begraben. Ich habe bereits einen Lösungsansatz der in der Theorie klappen müsste aber in der Praxis nicht wirklich rund läuft. Um das ganze zu veranschaulichen hier der Teil des scripts der ohne Probleme funktioniert:

PHP:
while [ true ] 
do

run=`ps ax | grep "programm.exe" | grep -v grep`

if [ "$run" = "" ]; then
sleep 1
echo "Rennt nicht. Also noch warten."
else
echo "Rennt. Also muss nun geprüft werden wie lang das Programm aktiv ist um es nach Fertigstellung wieder schliessen zu können."
exit
fi
done

So und jetzt kommt das was ich nicht wirklich hinbekomme. Ich möchte das das Script prüft obs Programm noch läuft indem es eine bestimmte Datei auf seine Änderungsuhrzeit hin überprüft und es mit der Systemzeit vergleich. Bei Abweichungen größer Null (ich habe mit Cut die ergebnisse der Uhrzeit auf die Minuten geschnitten. Sprich 2-stellig Zahlen) soll es dann das Mouse-Macro zum schliessen der GUI des Programms aktivieren. Vom Prinzip her habe ich das soweit auch lauffähig, klappt aber nicht zu meiner Zufriedenheit, weil es das Programm schließt obwohl es noch mit dem schreiben der Datei zugange ist. Das Script für diese Abfrage schaut so aus:

PHP:
while [ true ]  
do
sleep 70
latest=`ls -1t *.txt|head -n1`
filetime1=`perl -e '@d=localtime ((stat(shift))[9]); printf "%02d-%02d-%04d %02d:%02d:%02d\n", $d[3],$d[4]+1,$d[5]+190,$d[2],$d[1],$d[0]' "$latest" | cut -c 15-16`
systime=`date | cut -c 19-20`
if  [ "$filetime1" = "$systime" ]; then
echo "Programm ist noch am schreiben. Nicht schließen.
else
echo "Programm ist fertig und kann geschlossen werden"
exit
fi
done

So jetzt meine Frage. Wie kriege ich die beiden Scripts richtig "verheiratet"? Und wie schaffe ich es, dass er nicht denkt das Programm ist fertig obwohl es das aber noch nicht ist und fleissig in eine Datei reinschreibt.
 
Zuletzt bearbeitet:
Habe das Problem selber gelöst bekommen. Wie blöd ...

das

filetime1=`perl -e '@d=localtime ((stat(shift))[9]); printf "%02d-%02d-%04d %02d:%02d:%02d\n", $d[3],$d[4]+1,$d[5]+190,$d[2],$d[1],$d[0]' "$latest" | cut -c 15-16`

und das

systime=`date | cut -c 19-20`

geben, wenn man das script von Hand ausführt die korrekten werte. Wird es automatisch gestartet ist der Wert von systime verfälscht. Warum auch immer. Mache jetzt einfach bei jeder neuen Schleife nen "touch zeit" und lese mittels perl dann dieses File wie das "$latest" aus. Jetzt klappts. Sprich:

systime=`perl -e '@d=localtime ((stat(shift))[9]); printf "%02d-%02d-%04d %02d:%02d:%02d\n", $d[3],$d[4]+1,$d[5]+190,$d[2],$d[1],$d[0]' zeit | cut -c 15-16`
 
Zuletzt bearbeitet:
So und der Form halber hier die verheirateten Scripts :D. Et klappt! :D

PHP:
while [ true ] 
do
run=`ps ax | grep "programm.exe" | grep -v grep`
if [ "$run" = "" ]; then
sleep 1
else
open Start-Encoder.kamrd
sleep 5
	while [ true ]  
	do
	sleep 20
	latest=`ls -1t *.dts|head -n1`
	touch zeit
	filetime=`perl -e '@d=localtime ((stat(shift))[9]); printf "%02d-%02d-%04d %02d:%02d:%02d\n", $d[3],$d[4]+1,$d[5]+190,$d[2],$d[1],$d[0]' "$latest" | cut -c 15-16`
	systime=`perl -e '@d=localtime ((stat(shift))[9]); printf "%02d-%02d-%04d %02d:%02d:%02d\n", $d[3],$d[4]+1,$d[5]+190,$d[2],$d[1],$d[0]' zeit | cut -c 15-16`
	if  [ "$filetime" = "$systime" ]; then
	sleep 1
	else
	rm zeit
	open Close-Encoder.kamrd
	exit
	fi
	done
exit
fi
done
 
Zurück
Oben Unten