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 in diesem Supportartikel hinterlegt: /a/u8kZWWHIqeo
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