In einer Endlos-Schleife ein Verzeichnis pollen

Datum: 2003-03-20
Quelle: suse-linux

Worum ging es?

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.

Code
## 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
Beschreibung

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.