269 Tipps rss | 5 Nutzer online

Cron: Doppelte Script-Ausführung per LOCK vermeiden

Oft wird ein Shell-Script durch Cron regelmäßig in kurzen Abständen aufgerufen - beispielsweise um ein Logfile auszuwerten. Dabei kann es vorkommen, daß plötzlich das selbe Script zweimal oder noch öfter aktiv ist. Das führt meist zu unerwünschten Ergebnissen, bis hin zum Datenverlust - wenn etwa temporäre Dateien überschrieben werden, die aber vom vorhergehenden Script-Aufruf noch garnicht fertig bearbeitet wurden.

Mutige Programmierer schätzen einfach die Laufzeit des Scripts und stellen die Cron-Aufrufe auf entsprechend sichere Abstände. Bloß: Das geht schnell schief. Ist z.B. die Logfile-Auswertung einmal für ein paar Stunden ausgefallen, dauert der erste Aufruf danach natürlich wesentlich länger.

Sicherer ist die Verwendung eines sogenannten LOCKs: Das ist einfach eine Datei, deren Vorhandensein anzeigt, daß das Script bereits läuft. Zusammen mit einer kurzen Abfrage im Script blockiert das zuverlässig die doppelte Ausführung.

Damit droht allerdings sofort die nächste Falle: Denn bricht das Script einmal mit einem Fehler ab, bleibt das LOCK zurück und das Script wird überhaupt nicht mehr ausgeführt. Im Code-Beispiel hilft dagegen eine Statusmeldung, sobald das LOCK zu alt ist - diese Ausgabe schickt ein korrekt konfigurierter Cron als Mail an den Administrator.

#!/bin/sh

#

PROG=`basename $0`

LOCK=/var/lock/$PROG.lock

((LOCKAGE=4*60 )) # in Minuten

#

#

# Lock testen, ggf. Meldung machen

#

if [[ -f $LOCK ]] ; then

if [[ `find $LOCK -mmin +$LOCKAGE` ]] ; then

echo "Vorsicht: Lock fuer $PROG ist aelter als $LOCKAGE Minuten"

fi

exit 3

fi

#

#

# Lock setzen

#

touch $LOCK

#

#

# hier der Programmablauf

echo hallo!

#

#

# Lock loeschen und Ende

#

rm $LOCK

exit 0

[ch]

Add to Del.icio.us


Bedingungen für die Kommentareingabe
Hinweis



Ihr Kommentar:


Name:


Copyright © Der Strassenprogrammierer 1999-2012   | Tippscout 5.0
Zurück Tipps Startseite