Sunday, November 24, 2019

Was für ein Shebang (Für einen Cronjob)!?

Ich nutze folgenden Shebang in einigen Skripten, die ich als Cronjob starte:

#!/usr/bin/env -S chronic flock -n .lockfile.lock xvfb-run -a sh

Dieser Shebang verhindert doppelte Ausführung mittels Lockfile und erzeugt nur im Fehlerfall eine Ausgabe.

  • chronic: run program quietly unless it fails
  • flock: run program with a lock held
  • xvfb-run: run program in a virtual X server environment

Mit chronic(1) aus dem Paket moreutils, welches zusätzliche Unix-Hilfsprogramme bietet, wird das handeln des Quiet, Verbose- und Debug-Flags i.d.R. hinfällig. Denn es unterdrückt die Ausgabe und erzeugt nur im Fehlerfall die Ausgabe.

Das flock(1) richtet eine Sperrungen mittels Lockfile für das Skript ein und wartet solange, bis eine bereits laufende Instanz beendet ist. Mit dem Schalter -n beendet sich das Skript, wenn bereits eine Instanz läuft. Wird das Lockfile relativ angegeben, gilt es in der Crontab relativ zu HOME. Das flock(1) ist aus dem Paket util-linux, welches essential ist und hat das lckdo(1) aus moreutils abgelöst. In der Manpage zu lckdo(1) findet sich der Hinweis:

Now that util-linux contains a similar command named flock, lckdo is deprecated, and will be removed from some future version of moreutils.

Das xvfb-run(1) braucht es natürlich nur, wenn X benötigt wird.

Um den Shebang zu umgehen, z.B. beim testen, kann das Skript auch explizit mit dem Interpreter gestartet werden:

sh path/to/script.sh

Das alles funkioniert z.B. auch für Perl-Skripte.

PS: Vorher hatte ich hier lckdo(1) genutzt. Also vielen Dank an Flo, der in den Kommentaren darauf hinwies.