Cronjobs

Cronjobs sind wiederkehrende Aufgaben, die zeitgesteuert ausgeführt werden. Sie werden verwendet um regelmäßige Routine-Arbeiten wie Aufräumen der Datenbank, Generieren von Rechnungen und Zahlungserinnerungen, E-Mail-Jobs usw. auszuführen, in dem sie Scripten auf Deinem Webspace aufrufen.

Dies kann auf zwei Arten geschehen, entweder per URL-Cronjob (es wird eine öffentliche URL aufgerufen, wie von einem Browser) oder per Shell-Cronjob, wo ein Shell-Kommando ausgeführt wird. Der URL-Cronjob ist eine einfach einzurichtende Methode, hat aber den Nachteil, dass er gerade wenn der Cronjob lange läuft, auch Ressourcen wie einen Slot im Load Balancer belegt, der für Besucher nicht mehr frei ist. Gerade bei stark besuchten Webseiten oder wenn eine Webseite viele und lange laufende Cronjobs hat kann das ein Problem sein. Shell-Cronjobs zählen nicht zu den Web-Limits.

Im Gegensatz zu vielen anderen Hosting-Anbietern werden die Shell-Cronjobs bei uns nicht über das Crontab-File (z.B. crontab -e) gesteuert, sondern über ein Web-Interface und die API verwaltet. Unser API-Server macht aber im Hintergrund nichts anderes, als für jeden Shell-Cronjob eine Zeile in der Crontab-Datei anzulegen, wie Du es selber auch tun würdest. Wir haben uns dafür entschieden, da wir langfristig das "API-driven"-Modell umsetzen wollen und möglichst alles per API verwaltbar machen möchten. Es ist zwar etwas ungewohnt, nicht mehr crontab -e zu benutzen, funktioniert aber grundsätzlich genauso.

URL-Cronjob einrichten

Ein URL-Cronjob ist die am schnellsten erklärte Variante: rufe in der Verwaltung unter "Cronjobs" die Seite "Cronjob erstellen" auf. Dort wählst Du "URL-Cronjob" als Typ aus und kannst die Ausführungszeitpunkte und die URL, welche aufgerufen werden soll, angeben. Um den Cronjob zu testen kannst Du die URL selbst im Browser aufrufen.

Shell-Cronjob einrichten

Um einen Shell-Cronjob einzurichten gehst Du genauso vor: rufe in der Verwaltung unter "Cronjobs" die Seite "Cronjob erstellen" auf. Dort wählst Du "Shell-Cronjob" als Typ aus und kannst die Ausführungszeitpunkte und das Kommando, welche aufgerufen werden soll, angeben.

Als "Kommando" gibst Du das Kommando ein, wie Du es auch im Crontab-File eingeben würdest. Ein Beispiel, was die WP-Cron-Datei ausführt und die wiederkehrenden Aufgaben für ein WordPress erledigt:

cd mein-wordpress && php wp-cron.php

Cronjobs "exklusiv" ausführen

Wenn ein Shell-Cronjob immer nur einmal zur Zeit aktiv sein soll, und niemals mehrmals gleichzeitig laufen darf, bietet sich das Tool "flock" dafür an.

flock legt eine Lock-Datei (keine Log-Datei!) an, die benutzt wird um eine Sperre zu setzen. Diese Datei wird als Parameter angegeben vor dem Kommando eingefügt wird und ist neben dem auszuführenden Kommando der einzige erforderliche Parameter. Mit dem Argument -n können wir angeben, dass nicht darauf gewartet werden soll, dass das Lock frei wird, sondern der Cronjob nicht ausgeführt wird. Standardmäßig würde flock warten, bis das Lock frei wird. Das führt dann aber dazu, dass flock ewig wartet, bis das Lock frei wird und sich Prozesse so lange aufstapeln, bis keine neuen mehr ausgeführt werden.

cd mein-wordpress && flock -n ~/.cronlock php wp-cron.php

Wichtig ist, dass für jeden Cronjob ein eigenes Lock-File benutzt wird. Wenn beispielsweise zwei Cronjobs für zwei unterschiedliche WordPress-Seiten das gleiche Lock-File benutzen würden, wird nur ein Cronjob zur Zeit ausgeführt, es sollte aber beide Cronjobs gleichzeitig ausgeführt werden. Es wäre dann also sinnvoll z.B. ~/.cronlock1, ~/.cronlock2 etc. zu verwenden.

Cronjob-Ergebnisse loggen

Für die URL-Cronjobs wird automatisch bei jeder Ausführung ein HTTP-Log erzeugt und für 7 Tage aufbewahrt. Bei den Shell-Cronjobs kannst Du die Cronjobs selber in eine Datei loggen lassen:

cd mein-wordpress && php wp-cron.php &>> ~/logs/wp-cron.log

Das &>> leitet im Gegensatz zum "normalen" Shell-Redirect >> auch die stderr-Ausgabe um, so dass stdout und stderr an die Log-Datei angehängt werden.