Zum Hauptinhalt springen

Wie kann ich Cronjobs einrichten?

Cronjobs 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

Cronjobs sollten durch einen Sperrmechanismus immer nur einmal ausgeführt werden. Dies kann durch die Applikation, das Script oder durch die Verwendung von run-one umgesetzt werden.

Mehr Details zu diesem Sperrmechanismus sind im Abschnitt Wie verhindere ich dass Cronjobs mehrfach ausgeführt werden? hinterlegt:

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.

/home/www-data/scripts/job.sh Das auszuführende Script mit absoluter Pfadangabe.

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

Wie verhindere ich dass Cronjobs mehrfach ausgeführt werden?

Cronjobs müssen häufig regelmässig ausgeführt werden (zum Beispiel jede Minute). Die Ausführungszeit von Cronjobs steigt tendenziell mit wachsendem Datenbestand.

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: https://manpages.ubuntu.com/manpages/focal/man1/run-one.1.html