Datum: 2003-03-20
Quelle: suse-linux
Ausgangsbasis war die Frage, wie man ein Script endlos über ein Verzeichnis jagen könne, um darin eingestellte Dateien nach
PDF zu konvertieren. Mein Vorschlag ging in die Richtung, dies über einen regelmäßig laufenden crontab-Job
zu erledigen. Das ist robuster, weil Script-Abbrüche nicht dazu führen, dass der Job nicht mehr erledigt wird.
Der passende Eintrag in der crontab-Datei des Benutzers könnte wie folgt aussehen:
*/5 * * * * /pfad/zum/script
In diesem Fall wird der Job alle 5 Minuten gestartet.
## V1: beliebig viele Instanzen / as much instances as necessary # Dateisystem mehr als 90% gefuellt: Abbruch / file system is used more than 90% - break `df /file/system | tail -1 | \ sed 's/^.*[^0-9]\([0-9]*\)%.*$/\1/'` -ge 90 && exit 1 # Verarbeitungsschleife / processing loop for f in *.ps; do test -f "$f" && ps2pdf "$f" "`basename \"$f\" .ps`.pdf" && rm "$f" done ## V2: nur eine Instanz / only one instance # Dateisystem mehr als 90% gefuellt: Abbruch / file system is used more than 90% - break `df /file/system | tail -1 | \ sed 's/^.*[^0-9]\([0-9]*\)%.*$/\1/'` -ge 90 && exit 1 # laeuft schon: Abbruch / already running: break lock=/var/run/my_prog trap "rm $lock; exit 1" 1 2 3 15 test -f $lock && ps -p `cat $lock` >/dev/null && exit 0 # Lockfile anlegen / create lock file echo $$ >$lock # Verarbeitungsschleife / processing loop for f in *.ps; do ps2pdf "$f" "`basename \"$f\" .ps`.pdf" && rm "$f" done rm $lock
Die Eingangsprüfung in beiden Varianten auf die Auslastung des Dateisystems soll verhindern, dass Prozesse immer wieder
versuchen, in ein volles Dateisystem zu schreiben, hier hätte ein Weitermachen wirklich keinen Sinn.
Im ersten Fall kann das Script ohne weiteres in mehreren Instanzen parallel laufen (wenn z. B. das vorher gestartete Script
noch nicht fertig ist). Der test auf die Existenz der zu konvertierenden Datei ist dann notwendig,
um zu erkennen, ob ein evtl. parallel laufender Prozess die Datei zwischenzeitlich erwischt hat - die Dateiliste wird ja zum
Beginn der Schleife erzeugt.
Das zweite Beispiel erlaubt nur einen Prozess zur gleichen Zeit. Man muss etwas mehr Aufwand treiben, um noch laufende Prozesse
zu erkennen und dann abzubrechen. Zweckmäßig ist diese Variante z. B. auf älteren Rechnern, bei denen mehrere parallele
Konvertierungen das System zu stark belasten würden.