Zum Hauptinhalt springen

Cronjobs

Das Kommandozeilenprogramm cron ist ein Job Scheduler. Sie können Cron-Jobs verwenden, um sie regelmässig zu festen Zeiten, Daten oder Intervallen auszuführen.

Cronjobs erstellen und bearbeiten

Verbinden Sie sich via SSH zu Ihrem Server. Um Ihre Cronjobs zu bearbeiten, geben Sie auf der Shell crontab -e ein.

Limitationen

Ihre Crontab muss mit einer Leerzeile enden, sonst wird der letzte Job nicht ausgeführt.

Sperrmechanismus

Cron-Jobs sollten über eine Sperrfunktion verfügen, um zu verhindern, dass derselbe Befehl mehrmals ausgeführt wird.

Es ist üblich, Cron-Jobs häufig auszuführen, zum Beispiel jede Minute. Die Ausführungszeit nimmt tendenziell mit einem wachsenden Datenbestand zu.

Dies kann zu Überlappungen in der Ausführung führen, wenn der vorherige Job nicht bereits beendet wurde. Häufig tritt in diesen Fällen ein exponentielles Wachstum der Ausführungszeit sowie der benötigten Systemressourcen (CPU, RAM) auf. Um sicherzustellen, dass ein Cronjob nicht mehrfach gleichzeitig ausgeführt wird, steht auf unseren Systemen der Wrapper run-one zur Verfügung. Der Wrapper kann als Prefix für einen Cronjob verwendet werden:

* * * * * /usr/bin/run-one /home/www-data/scripts/job.sh &> /dev/null

run-one ist ein Wrapper aus dem gleichnamigen Ubuntu Paket. Weitere Informationen zu run-one und ähnlichen hilfreichen Wrappern finden Sie in den Ubuntu Manpages.

Zeitangaben

Die Zeitangaben in der Crontab Datei werden folgendermassen definiert:

┌───────────── Minute (0 - 59)
│ ┌───────────── Stunde (0 - 23)
│ │ ┌───────────── Tag des Monats (1 - 31)
│ │ │ ┌───────────── Monat (1 - 12)
│ │ │ │ ┌───────────── Wochentag (0 - 6)
│ │ │ │ │
* * * * * /home/www-data/scripts/job.sh

* Eine Wildcard für jede Minute / Stunde / etc. Dieser Cronjob läuft jede Minute, in jeder Stunde, an jedem Tag des Monats, in jedem Monat, zu jedem Wochentag. Weitere Beispiele finden Sie unter crontab.guru/examples.html.

Shell, Pfad und Mailversand

SHELL=/bin/sh
PATH=/home/www-data/scripts:/usr/local/bin:/bin:/usr/sbin:/usr/bin
MAILTO=user@example.org

* * * * * job.sh

Der cron Daemon läuft mit einer Basis PATH Variable von /usr/bin:/bin.

Falls sie relative Programmaufrufe tätigen möchten, die sich ausserhalb dieses PATH befinden, können Sie den PATH am Anfang der Crontab erweitern. Alternativ kann der vollständigen Pfad angeben werden.

Die Standard "Shell" der Cronjobs können Sie mittels der Variable SHELL definieren. Ohne weitere Angabe wird dash genutzt.

Mithilfe des Parameters MAILTO=user@domain.org wird die Ausgabe von Cronjobs per E-Mail an die angegebene Adresse gesendet.

Optionale Ausgabeparameter

  • Der optionale Parameter &> /dev/null verwirft die Ausgabe des Befehls (SYSOUT)
  • Der optionale Parameter >/dev/null 2>&1 verwirft die Ausgabe und Fehlermeldungen des Befehls (SYSOUT+SYSERR)

Beispiele

Jede 5. Minute zu jeder Stunde

Mittels curl eine URL aufrufen:

5 * * * * /usr/bin/run-one /usr/bin/curl https://domain.org/cron/run &> /dev/null

Jede 4. Stunde zur vollen Stunde

Hinweis: Das aufzurufende Script muss ausführbar sein: chmod u+x /home/www-data/scripts/refresh_cache.sh

0 */4 * * * /usr/bin/run-one /home/www-data/scripts/refresh_cache.sh &> /dev/null

Jeden Mittwoch um 0:30 Uhr

Hinweis: Das aufzurufende Script muss ausführbar sein: chmod u+x /home/www-data/scripts/weekly_report.sh

30 5 * * 3 /usr/bin/run-one /home/www-data/scripts/weekly_report.sh &> /dev/null

Weitere Erläuterungen zur Syntax sowie Praxisbeispiele werden anschaulich auf der folgenden Wikipedia-Seite erklärt: https://de.wikipedia.org/wiki/Cron