Shell-Skript + trap

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Shell-Skript + trap

Beitrag von Duff » 06.05.2010 16:23:34

Hallo,

ich habe mal eine Frage zu Shell-Skript Programmierung.

Und zwar habe ich ein Wrapper-Skript, welches in einer while-Schleife ein anderes Skript ausführt und anschließend per sleep eine bestimmtes Zeitinterval wartet.
In dem Wrapper-Skript fange ich per trap SIGTERM ab. Dieses habe ich 2mal definiert. Einmal ausserhalb und einmal innerhalb der Schleife. Innerhalb der Schleiße wird ein break ausgeführt, damit die Schleife verlassen wird und das Skript, welches in der Schleife aufgerufen wird, läuft entweder durch oder wird erst gar nicht aufgerufen.

Allerdings ist das Zeitinterval vom sleep relativ hoch und es wird ggf. beim Senden des kill-Befehls kill -SIGTERM <PID des Wrapper-Skripts> das Sleep noch abgewartet, was ich jedoch nicht möchte.

Wie könnte ich sowas elegant lösen?
Eine do-while Schleife gibt es ja leider nicht.
Oh, yeah!

uname
Beiträge: 12422
Registriert: 03.06.2008 09:33:02

Re: Shell-Skript + trap

Beitrag von uname » 06.05.2010 16:34:14

Eine do-while Schleife gibt es ja leider nicht.
Dein Problem habe ich nicht verstanden. Aber statt "do ... while" wäre vielleicht "until" ganz nett. Keine Ahnung ob das hilft.

Code: Alles auswählen

#!/bin/bash 
         COUNTER=20
         until [  $COUNTER -lt 10 ]; do
             echo COUNTER $COUNTER
             let COUNTER-=1
done
Alternativ würde ich einen Semaphor (Variable) setzen und einfach stumpf am Anfang des nächsten Durchlaufs neu abfragen.

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: Shell-Skript + trap

Beitrag von Duff » 06.05.2010 17:41:28

Danke. Habe mich wohl ein wenig undeutlich ausgedrückt.

Hier mal ein Beispiel, wie ich es meine (hoffe, dass es nun verständlicher ist). Von einer anderen Konsole sende per kill -15 <PID> das Signal SIGTERM, auf welches da s Skript wie folgt reagiert:
Habe in der Ausgabe mit # den Startpunkt des kill-Befehls markiert

Code: Alles auswählen

daniel@daniel-tablet:~/scripts/bash$ time ./wrapper_script 
PID 4340
# ab hier wurde kill-Befehl gesendet
exit program

real	0m5.008s
user	0m0.000s
sys	0m0.012s
daniel@daniel-tablet:~/scripts/bash$ time ./wrapper_script 
PID 4342
start wrapper script...
# ab hier wurde kill-Befehl gesendet
exit program

real	0m10.010s
user	0m0.008s
sys	0m0.000s
daniel@daniel-tablet:~/scripts/bash$ time ./wrapper_script 
PID 4345
start wrapper script...
loop, do something...
Execute script....
sleep 20
# ab hier wurde kill-Befehl gesendet
break loop

real	0m32.016s
user	0m0.008s
sys	0m0.008s
daniel@daniel-tablet:~/scripts/bash$ time ./wrapper_script 
PID 4350
start wrapper script...
loop, do something...
# ab hier wurde kill-Befehl gesendet
break loop

real	0m12.013s
user	0m0.004s
sys	0m0.016s
daniel@daniel-tablet:~/scripts/bash$ 
Anhand der Zeiten sieht man, dass zuerst das sleep 20 abgewartet wird, bevor die Schleife per break verlassen wird. Da das Interval vom sleep mit 20 Sekunden auch gerne größer werden könnte, möchte ich nicht so lange abwarten müssen. Mir geht es nur darum, dass die Skripte vor dem sleep sauber beendet werden.
Oh, yeah!

Antworten