o

Cronjob und Crontab: Syntax, Sonderzeichen und Beispiele

Diese Seite erklärt, wie ein Crontab-Ausdruck aufgebaut ist, was die Sonderzeichen bedeuten und welche Fehler am häufigsten passieren. Mit fertigen Beispielen zum Abschreiben und einem Verzeichnis der Begriffe.

Zum Crontab-Generator: Ausdruck bauen und die nächsten Termine sehen

Was ist ein Cronjob?

Ein Cronjob ist eine Aufgabe, die zu festgelegten Zeiten automatisch läuft, ohne dass jemand sie anstößt. Der Name kommt von cron, dem Dienst, der auf Unix-Systemen im Hintergrund läuft und jede Minute nachsieht, was gerade fällig ist. Typische Aufgaben sind nächtliche Sicherungen, das Versenden von Newslettern, das Aufräumen alter Dateien oder das Abholen von Daten aus einer fremden Schnittstelle.

Was zu welchem Zeitpunkt geschehen soll, steht in der Crontab, einer schlichten Textdatei. Jede Zeile darin besteht aus einem Zeitplan und einem Befehl. Der Zeitplan ist der Teil, der die meisten Fragen aufwirft, und um den geht es hier.

Aufbau eines Crontab-Ausdrucks

Der Zeitplan besteht aus fünf Feldern, getrennt durch Leerzeichen. Sie stehen immer in derselben Reihenfolge, von der kleinsten zur größten Einheit, mit dem Wochentag als Nachzügler am Ende:

*/15  9-17  *  *  1-5
 │     │    │  │   │
 │     │    │  │   └─ Wochentag      (0-7)
 │     │    │  └───── Monat          (1-12)
 │     │    └──────── Tag des Monats (1-31)
 │     └───────────── Stunde         (0-23)
 └─────────────────── Minute         (0-59)

Gelesen heißt dieser Ausdruck: alle 15 Minuten, zwischen 9 und 17 Uhr, montags bis freitags.

Feld Bedeutung Werte Hinweis
1 Minute 0-59 Die Minute innerhalb der Stunde.
2 Stunde 0-23 0 ist Mitternacht, 23 ist 23 Uhr. Keine 12-Stunden-Zaehlung.
3 Tag des Monats 1-31 Der 31. wird in kurzen Monaten schlicht uebersprungen.
4 Monat 1-12 Statt Zahlen gehen auch JAN bis DEC.
5 Wochentag 0-7 0 und 7 stehen beide fuer Sonntag. Auch SUN bis SAT sind erlaubt.

Die Sonderzeichen

In jedem der fünf Felder sind vier Zeichen erlaubt. Mehr braucht man nicht, und mehr kennt der Unix-Cron auch nicht.

Zeichen Name Bedeutung Beispiel
* Jeder Wert Das Feld wird nicht eingeschraenkt. Steht in allen fuenf Feldern ein Stern, laeuft der Job jede Minute. * * * * *
, Aufzaehlung Mehrere einzelne Werte, durch Komma getrennt und ohne Leerzeichen. 0,15,30,45 * * * *
- Bereich Von, bis, jeweils einschliesslich der Grenzen. 9-17 meint also auch 9 und 17. 0 9-17 * * *
/ Schrittweite Jeder n-te Wert, gezaehlt ab dem kleinsten Wert des Bereichs. */15 ergibt 0, 15, 30 und 45, nicht "alle 15 Minuten ab jetzt". */15 * * * *

Kurzformen statt fünf Feldern

Für die gängigsten Zeitpläne gibt es Abkürzungen, die anstelle der fünf Felder stehen. Sie sind bequem, aber sie legen den Zeitpunkt fest: @daily ist immer Mitternacht, nicht irgendwann am Tag.

Kurzform Entspricht Bedeutung
@yearly 0 0 1 1 * Einmal im Jahr, am 1. Januar um Mitternacht. @annually bedeutet dasselbe.
@monthly 0 0 1 * * Am ersten Tag jedes Monats um Mitternacht.
@weekly 0 0 * * 0 Jeden Sonntag um Mitternacht.
@daily 0 0 * * * Taeglich um Mitternacht. @midnight bedeutet dasselbe.
@hourly 0 * * * * Jede Stunde zur vollen Stunde.
@reboot Einmalig beim Start des Systems. Das hat keinen Zeitplan und laesst sich bei einem Dienst, der Adressen von aussen aufruft, nicht abbilden.

Beispiele zum Abschreiben

Von oben nach unten von häufig zu selten. Der letzte Eintrag ist kein Beispiel, sondern eine Warnung.

Ausdruck Läuft
* * * * * Jede Minute.
*/5 * * * * Alle fuenf Minuten, also zur Minute 0, 5, 10 und so weiter.
*/10 * * * * Alle zehn Minuten.
0 * * * * Jede Stunde zur vollen Stunde.
30 * * * * Jede Stunde um halb.
0 */2 * * * Alle zwei Stunden, jeweils zur vollen Stunde.
5 0 * * * Taeglich um 0:05 Uhr. Fuenf Minuten Versatz sind sinnvoll, weil um Punkt Mitternacht sehr viele Jobs starten.
0 3 * * * Taeglich um 3 Uhr nachts.
15 2 * * * Taeglich um 2:15 Uhr.
0 9-17 * * * Stuendlich von 9 bis 17 Uhr, also neun Aufrufe am Tag.
*/15 9-17 * * 1-5 Alle 15 Minuten, von 9 bis 17 Uhr, Montag bis Freitag.
0 8 * * 1 Jeden Montag um 8 Uhr.
0 8 * * 1,3,5 Montag, Mittwoch und Freitag um 8 Uhr.
0 22 * * 6 Jeden Samstag um 22 Uhr.
0 0 * * 0 Jeden Sonntag um Mitternacht.
0 0 1 * * Am ersten Tag jedes Monats um Mitternacht.
0 4 1,15 * * Am 1. und am 15. jedes Monats um 4 Uhr.
0 0 28-31 * * An jedem Tag vom 28. bis 31. Welcher davon der letzte Tag des Monats ist, muss das Skript selbst pruefen.
0 0 1 1 * Einmal im Jahr, am 1. Januar um Mitternacht.
0 12 1-7 * 1 Achtung, eine Falle: nicht "am ersten Montag im Monat", sondern an jedem Tag vom 1. bis 7. UND zusaetzlich an jedem Montag. Siehe Stolpersteine.

Stolpersteine

Tag des Monats und Wochentag werden mit ODER verknuepft

Das ist der haeufigste Fehler ueberhaupt. Sobald in beiden Feldern etwas anderes als ein Stern steht, laeuft der Job an jedem Tag, auf den eine der beiden Angaben passt, nicht nur wenn beide zutreffen. 0 12 1-7 * 1 laeuft also an sieben Tagen am Monatsanfang und zusaetzlich an jedem Montag. Wer wirklich den ersten Montag treffen will, laesst den Cron an allen Tagen 1 bis 7 laufen und bricht im Skript ab, wenn nicht Montag ist.

Die Schrittweite zaehlt ab dem Anfang des Bereichs, nicht ab jetzt

*/40 im Minutenfeld ergibt die Minuten 0 und 40. Danach ist die Stunde zu Ende, und es geht wieder bei 0 los. Der Abstand ist also 40, dann 20 Minuten. Gleichmaessige Abstaende gibt es nur bei Schrittweiten, die 60 glatt teilen: 2, 3, 4, 5, 6, 10, 12, 15, 20 und 30.

Sonntag ist 0 und 7 zugleich

Das Wochentagsfeld geht von 0 bis 7, weil beide Enden Sonntag meinen. Montag ist 1, Samstag ist 6. Wer aus einer anderen Umgebung kommt, in der die Woche bei Sonntag als 1 beginnt, verschiebt seine Jobs sonst um einen Tag.

Das Prozentzeichen beendet den Befehl

In einer echten Crontab-Datei hat % eine Sonderbedeutung und muss als \% geschrieben werden. Der Klassiker ist ein Datum im Dateinamen, etwa date +\%Y-\%m-\%d. Ohne Maskierung bricht der Befehl mitten im Datum ab. In einer Adresse, die von aussen aufgerufen wird, tritt das Problem nicht auf.

Zeitzone und Sommerzeit

Ein Cron rechnet in der Zeitzone des Systems. Bei der Umstellung auf Sommerzeit faellt eine Stunde aus, im Herbst kommt sie doppelt. Ein Job, der auf 2:30 Uhr steht, laeuft im Fruehjahr an einem Tag gar nicht und im Herbst zweimal. Wenn das stoert, legen Sie den Job ausserhalb des Zeitfensters zwischen 2 und 3 Uhr.

Cron wartet nicht auf den vorigen Lauf

Steht ein Job auf jede Minute, braucht aber neunzig Sekunden, laufen bald mehrere Kopien parallel. Cron kuemmert das nicht. Wer das verhindern will, setzt im Skript eine Sperre, etwa eine Datei, die zu Beginn angelegt und am Ende geloescht wird, oder eine Sperre in der Datenbank.

L, W, ? und # gehoeren nicht zum Unix-Cron

Ausdruecke wie 0 0 L * ? fuer den letzten Tag des Monats stammen aus Quartz, dem Zeitplaner der Java-Welt. Der Unix-Cron kennt sie nicht und lehnt sie ab. Dort loest man den letzten Tag des Monats ueber 28-31 und eine Pruefung im Skript.

Begriffe

cron
Der Dienst, der auf Unix-Systemen im Hintergrund laeuft und faellige Aufgaben startet. Der Name stammt vom griechischen chronos, Zeit.
Cron-Daemon
Der laufende Prozess des Dienstes, meist crond genannt. Er prueft jede Minute, welche Eintraege faellig sind.
Cronjob
Eine einzelne geplante Aufgabe: ein Zeitplan und das, was zu diesem Zeitpunkt geschehen soll.
Crontab
Die Tabelle mit den Cronjobs eines Benutzers, kurz fuer cron table. Bearbeitet wird sie mit crontab -e, angezeigt mit crontab -l.
Crontab-Ausdruck
Die fuenf durch Leerzeichen getrennten Felder, die den Zeitplan beschreiben, zum Beispiel */15 9-17 * * 1-5.
Web-Cron
Ein Zeitplaner, der statt eines Befehls eine Adresse aufruft. Nuetzlich auf Webspace ohne eigenen Cron oder wenn der Cron des Hosters zu grob ist.
Exit-Code
Die Rueckmeldung eines Programms an das System. 0 heisst erfolgreich, alles andere bedeutet einen Fehler. Beim Aufruf ueber HTTP tritt an seine Stelle der Statuscode, etwa 200 fuer erfolgreich oder 500 fuer einen Fehler im Skript.
Standardausgabe
Alles, was ein Programm waehrend des Laufs ausgibt, in der Unix-Welt stdout und stderr genannt. Ein echter Cron schickt das per Mail an den Benutzer. Bei einem Aufruf ueber HTTP ist es schlicht das, was die Seite zurueckgibt.
Sperre
Eine Markierung, die verhindert, dass ein Job zweimal gleichzeitig laeuft. Meist eine Datei oder ein Eintrag in der Datenbank, gesetzt beim Start und entfernt am Ende.
Ueberlappung
Der Fall, dass ein neuer Lauf beginnt, waehrend der vorige noch arbeitet. Cron verhindert das nicht von allein.
Zeitzone
Cron rechnet in der Zeitzone des Systems, nicht in Ihrer. Wer sich nicht sicher ist, prueft das mit timedatectl oder date.
UTC
Die koordinierte Weltzeit, ohne Sommerzeit. Server laufen oft in UTC, damit Zeitplaene keine Umstellung mitmachen. Deutschland liegt eine Stunde davor, im Sommer zwei.
wget und curl
Zwei Kommandozeilenprogramme, die eine Adresse abrufen. Sie sind der uebliche Weg, wenn ein Cron auf dem eigenen Server eine Seite aufrufen soll.
Task Scheduler
Das Gegenstueck unter Windows, auch Aufgabenplanung genannt. Es kennt die Crontab-Syntax nicht, sondern wird ueber eine eigene Oberflaeche eingerichtet.

Und bei Cronjob.de?

Bei Cronjob.de tragen Sie keinen Befehl ein, sondern eine Adresse. Wir rufen sie zum gewünschten Zeitpunkt per HTTP GET auf, so wie es ein Browser täte. Was dann geschieht, entscheidet Ihr Skript auf Ihrem Server. Den Zeitplan können Sie über Auswahlfelder zusammenklicken oder als Crontab-Ausdruck eintippen, genau in der Schreibweise, die auf dieser Seite steht.

Zwei Unterschiede zum Cron auf einem eigenen Server sind wichtig: @reboot lässt sich nicht abbilden, weil es keinen Systemstart gibt, an den sich der Aufruf hängen könnte. Und die Standardausgabe kommt nicht per Mail, sondern steht im Aufrufprotokoll, zusammen mit Laufzeit und Statuscode.

Crontab-Generator · Anleitungen für einzelne Systeme · Ersten Cronjob anlegen · FAQ