Shellskript zu bestimmter Uhrzeit abbrechen

Hallo.

Ich lasse hier regelmäßig ein Skript laufen, dass mehrere Programme nacheinander aufruft. Jeder Aufruf kann einige Zeit (bis zu mehrere Stunden) in Anspruch nehmen. Jetzt möchte ich einbauen, dass zwischen diesen einzelnen Programmaufrufen die Zeit überprüft wird und falls eine bestimmte Uhrzeit überschritten wurde, das Skript abgebrochen wird. Mein Problem ist, dass ich nicht weiß, wie ich die Zeit abfrage und überprüfe, ob eine bestimmte Uhrzeit überschritten ist (incl. möglichem Datumswechsel).

Kann mir jemand weiterhelfen?

Sebastian.

Hi Sebastian,

Ich lasse hier regelmäßig ein Skript laufen, dass mehrere
Programme nacheinander aufruft. Jeder Aufruf kann einige Zeit
(bis zu mehrere Stunden) in Anspruch nehmen. Jetzt möchte ich
einbauen, dass zwischen diesen einzelnen Programmaufrufen die
Zeit überprüft wird und falls eine bestimmte Uhrzeit
überschritten wurde, das Skript abgebrochen wird. Mein Problem
ist, dass ich nicht weiß, wie ich die Zeit abfrage

wie waere es mit date? Also z.B.

date +"%Y%m%d%H%M%S"

und
überprüfe, ob eine bestimmte Uhrzeit überschritten ist (incl.
möglichem Datumswechsel).

Kann mir jemand weiterhelfen?

Sebastian.

Was du willst, ist wahrscheinlich eine Art Timeout-Funktion. Probiers doch mal mit Signalen innerhalb des Shellscripts:

#! /usr/bin/ksh

export PIDPARENT=$$ # aktuelle PID (an die wird ein
 # USR1-Signal gesendet
TIMEOUT=10 # solange warten, dann gibts eine
 # Notbremse
ABORT=0 # Flag: Schleife beenden

trap "ABORT=1" USR1 # Signalbehandlung fuer USR1-Signal 
 # einschalten

( # Watchdog scharfmachen (als 
 # Hintergrundprozess)
 sleep ${TIMEOUT}; # warte Timeout Sek., dann
 kill -USR1 $PIDPARENT # Abbruch per Signal
) & 

while [$ABORT -eq 0] # wenns mal wieder lasenger dauert
do
 echo waiting...
 sleep 1
done
echo "hier gehts nach while weiter"

Das kann man natürlich alles noch viel schöner machen.

gruss
bernhard

Hi!

Ich lasse hier regelmäßig ein Skript laufen, dass mehrere
Programme nacheinander aufruft. Jeder Aufruf kann einige Zeit
(bis zu mehrere Stunden) in Anspruch nehmen. Jetzt möchte ich
einbauen, dass zwischen diesen einzelnen Programmaufrufen die
Zeit überprüft wird und falls eine bestimmte Uhrzeit
überschritten wurde, das Skript abgebrochen wird. Mein Problem
ist, dass ich nicht weiß, wie ich die Zeit abfrage

wie waere es mit date? Also z.B.

date +"%Y%m%d%H%M%S"

Und wie kann ich das in einer Abfrage benutzen?

Was du willst, ist wahrscheinlich eine Art Timeout-Funktion.
Probiers doch mal mit Signalen innerhalb des Shellscripts:

Das kann man natürlich alles noch viel schöner machen.

Hm, ich will eigentlich nicht, dass das aktuelle Programm abgebrochen wird, sondern nur, dass das nächste nicht mehr startet. Geht das auch damit?

Danke,
Sebastian.

Hallo,

Ich lasse hier regelmäßig ein Skript laufen, dass mehrere
Programme nacheinander aufruft. Jeder Aufruf kann einige Zeit
(bis zu mehrere Stunden) in Anspruch nehmen. Jetzt möchte ich
einbauen, dass zwischen diesen einzelnen Programmaufrufen die
Zeit überprüft wird und falls eine bestimmte Uhrzeit
überschritten wurde, das Skript abgebrochen wird. Mein Problem
ist, dass ich nicht weiß, wie ich die Zeit abfrage und
überprüfe, ob eine bestimmte Uhrzeit überschritten ist (incl.
möglichem Datumswechsel).

Du könntest das Programm mit start-stop-daemon starten und nach der gewünschten Zeit (man at oder man sleep) mit start-stop-daemon beenden.

HTH,

Sebastian

Hi!

Hallo,

wie waere es mit date? Also z.B.

> > date +"%Y%m%d%H%M%S"

Und wie kann ich das in einer Abfrage benutzen?

So? Wahrscheinlich gar nicht. Vielleicht so:

startime=`date +%s`
while [`expr $startime + 3600` -lt `date +%s`]
do
 # do all the work
 do\_it
done

(Vorsicht: das wird vielleicht Anfang 2038 ein Problem haben.)

Hm, ich will eigentlich nicht, dass das aktuelle Programm
abgebrochen wird, sondern nur, dass das nächste nicht mehr
startet. Geht das auch damit?

Das wird auch nicht abgebrochen. Das Script terminiert sich selbst. Da es die Kindprozesse nicht mit wegraeumt bleiben die haengen (und werde an PID 1 weitergereicht). Das Script kann keine weiteren Programme mehr starten, aktuell laufende werden zu Ende gerechnet und dann von (ueblicherweise) init weggeraeumt.

Gruss vom Frank.