Crontabs

Crontabs sind einige der wenigen Anwendungen, bei der tatsächlich die hinter den virtuellen Webservern liegende physische Infrastruktur beachtet werden muss, da sich Crontabs nicht einfach so verteilen lassen. Normalerweise loggt man sich ja direkt auf dem Namen des betoiffenen virtuellen Webservers ein. Die aktuell an der Erbringung des Dienstes beteiligten Maschinen lassen sich dann mit clcmd getfqdn auflisten.

Einzelne dieser Maschinen können immer mal ausfallen oder gewartet werden, ohne dass der Dienst "virtuelle Webserver" dadurch betroffen ist - wenn aber eine Crontab dann nur auf diesem einen Rechner eingetragen ist, läuft sie ggf. längere Zeit nicht. Wichtige Crontabs sollten deswegen über alle Maschinen des Webserver-Clusters verteilt werden:

  • Einträge, die zwar regelmäßig laufen sollen, wobei es aber nicht auf jeden einzelnen Lauf ankommt, können beispielweise zeitlich verteilt werden - morgens auf der einen Maschine, mittags auf der anderen, abends auf der nächsten, etc.
  • Einträge, die regelmäßig laufen müssen, aber zeitlich entzerrt sind, kann man z.B. über eine Timestamp steuern. Für einen stündlichen Job könnte die erste Maschine zur vollen Stunde die Timestamp prüfen und ggf. den Job aufrufen und im Erfolgsfall die Timestamp aktualisieren; die nächste Maschine würde dann "um Viertel nach" das gleiche machen, die dritte "um Halb", etc.
  • Bei noch engeren Abständen bzw. langen Laufzeiten, die die Gefahr einer Überlappung der Jobs bieten, sollten Lockfiles auf einem gesharten Medium (z.B. das Homeverzeichnis des Service-Accounts) zum Einsatz kommen.Entsprechende Crontab-Aufrufe starten dann auf allen Maschinen den Job, falls er nicht gerade woanders läuft - hier sollten dann alle Crontab-Einträge auf den gleichen Zeitpunkt lauten (Achtung: Falls die Ausführungszeit des Jobs kürzer ist als der Zeitversatz zwischen den Maschinen, kann der Job auch mehrmals laufen). Leider haben NFS-Locks den Ruf, auch mal hängen bleiben zu können, weswegen dies kein Allheilmittel ist.

Beispiele

Timestamps

Ein Job, der alle 60 Minuten ausgeführt werden soll, ließe sich beispielsweise so realisieren:

0 * * * * test -z `find $HOME/test.scc.kit.edu/run/timestamp -mmin -60 2>/dev/null` && $HOME/test.scc.kit.edu/bin/cronjob && touch $HOME/test.scc.kit.edu/run/timestamp

wobei der Zeitpunkt auf jeder Maschine ein anderer sein sollte, für test.scc.kit.edu natürlich der eigene virtuelle Webserver zu wählen ist, das Verzeichnis $HOME/test.scc.kit.edu/run vorher angelegt werden muss und $HOME/test.scc.kit.edu/bin/cronjob den auszuführenden Cronjob darstellt.

Lockfiles

Ein Job, der stündlich ausgeführt werden soll, ließe sich hier so realisieren:

0 * * * * /usr/machine/bin/lockcmd $HOME/test.scc.kit.edu/run/lockfile $HOME/test.scc.kit.edu/bin/cronjob

wobei für test.scc.kit.edu wieder der eigene virtuelle Webserver zu wählen ist, das Verzeichnis $HOME/test.scc.kit.edu/run ebenfalls vorher angelegt werden muss und $HOME/test.scc.kit.edu/bin/cronjob auch hier den auszuführenden Cronjob darstellt.