Zum Inhalt springen

Crontab-Syntax: Felder, Sonderzeichen und Beispiele

Ein Crontab-Ausdruck legt in fünf Feldern fest, wann ein Cronjob läuft: Minute, Stunde, Tag des Monats, Monat und Wochentag. */5 * * * * heißt „alle 5 Minuten“, 0 3 * * * heißt „täglich um 3:00 Uhr“. Hier stehen alle Sonderzeichen, Beispiele zum Abschreiben und die häufigsten Fehler.

Stand:

┌───────────── Minute (0–59)
│ ┌─────────── Stunde (0–23)
│ │ ┌───────── Tag des Monats (1–31)
│ │ │ ┌─────── Monat (1–12)
│ │ │ │ ┌───── Wochentag (0–7, Sonntag = 0 oder 7)
│ │ │ │ │
* * * * *  Befehl
Die häufigsten Ausdrücke
* * * * *jede Minute
*/5 * * * *alle 5 Minuten
0 * * * *jede Stunde zur vollen Stunde
0 3 * * *täglich um 3:00 Uhr
0 6 * * 1-5werktags um 6:00 Uhr
0 0 1 * *am 1. jedes Monats um Mitternacht

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

Was ist Cron?

Cron ist ein Dienst auf Linux- und Unix-Systemen, der Aufgaben zu festgelegten Zeiten startet. Er läuft ständig im Hintergrund, sieht jede Minute in die Crontab-Dateien und führt aus, was gerade fällig ist. Der Name geht auf das griechische Wort chronos für Zeit zurück.

Den Dienst gibt es seit Ende der 1970er-Jahre, heute ist er auf praktisch jedem Linux-Server vorhanden. Gesteuert wird er über die Crontab: Jeder Benutzer hat eine eigene, dazu kommen systemweite Einträge in /etc/crontab und /etc/cron.d.

Zwei Dinge kann cron nicht: Es läuft nur, solange der Server läuft, und ob eine Aufgabe fehlgeschlagen ist, sieht man nur in der umgeleiteten Ausgabe oder im Log. Auf vielen Webspace-Paketen gibt es cron außerdem gar nicht. Dann ruft ein Dienst wie Cronjob.de die Adresse Ihres Skripts nach demselben Zeitplan von außen auf – mit Protokoll jedes Aufrufs und einer Nachricht, wenn etwas schiefgeht.

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.

Cronjob oder Crontab: der Unterschied

Die beiden Wörter werden oft durcheinandergeworfen, meinen aber verschiedene Dinge. Die Crontab ist die Liste: eine Textdatei, in der steht, was wann laufen soll. Ein Cronjob ist ein einzelner Eintrag daraus, also eine geplante Aufgabe. Und cron ist der Dienst, der die Liste liest und die Aufgaben startet.

Kurz: Die Crontab enthält Cronjobs, und cron führt sie aus. Wer keinen eigenen Server hat, braucht deshalb auch keine Crontab-Datei zu pflegen – die Liste liegt dann bei einem Dienst wie diesem, der Zeitplan bleibt derselbe.

Was ist ein Cron-Ausdruck?

Ein Cron-Ausdruck ist der Zeitplan eines Cronjobs: fünf Felder für Minute, Stunde, Tag, Monat und Wochentag, getrennt durch Leerzeichen. 0 6 * * 1-5 heißt zum Beispiel „um 6:00 Uhr, montags bis freitags“. Ein Stern bedeutet „jeder Wert“, und mit Komma, Bindestrich und Schrägstrich lassen sich Listen, Bereiche und Schritte angeben. Wie das im Einzelnen funktioniert, steht unten unter Aufbau und Sonderzeichen.

Nicht jeder Cron-Ausdruck hat fünf Felder. Java-Bibliotheken wie Quartz und Spring stellen ein Feld für Sekunden voran, Quartz kennt zusätzlich ein Jahr und das Fragezeichen für „kein bestimmter Wert“. Aus 0 6 * * 1-5 wird dort 0 0 6 ? * MON-FRI. Ein solcher Ausdruck funktioniert in einer Crontab nicht – und umgekehrt.

Was ist ein Heartbeat?

Ein Heartbeat ist ein regelmäßiges Lebenszeichen: Ein Cronjob ruft nach jedem Lauf eine bestimmte Adresse auf und meldet damit „Ich bin durch“. Ein Überwachungsdienst kennt den Takt und weiß, wann die nächste Meldung fällig ist. Bleibt sie aus, schlägt er Alarm. Im Englischen heißt das Prinzip auch Dead Man's Switch.

Damit lässt sich überwachen, was cron selbst nicht meldet: einen Job, der gar nicht erst startet, weil der Server steht, und einen Job, der unterwegs scheitert. In der Crontab genügt dafür ein Anhang an die Zeile, etwa ; curl -fsS -m 10 https://runcheck.de/a8k3m2x9q1/$? – $? schickt den Exit-Code mit, 0 heißt Erfolg.

Bei Cronjob.de gibt es Heartbeats für Jobs auf dem eigenen Server, in n8n, Laravel, Supabase oder Vercel – im selben Konto wie die Cronjobs, die wir aufrufen. Cronjob überwachen

Die Crontab-Befehle

Auf einem eigenen Server wird die Crontab nicht mit einem Texteditor geöffnet, sondern über den Befehl crontab verwaltet. Vier Aufrufe decken alles ab:

Befehl Was er tut
crontab -lZeigt die Crontab des angemeldeten Benutzers an, ohne etwas zu ändern. Der übliche erste Griff, wenn man wissen will, was auf einer Maschine überhaupt läuft.
crontab -eÖffnet die Crontab zum Bearbeiten. Beim Speichern prüft cron die Syntax und lehnt eine fehlerhafte Zeile ab, statt sie stillschweigend zu übernehmen.
crontab -rLöscht die gesamte Crontab, ohne Rückfrage. Die Taste r liegt neben e, was schon viele Listen gekostet hat – mit -i wird vorher gefragt.
crontab -u name -lArbeitet mit der Crontab eines anderen Benutzers. Jeder Benutzer hat seine eigene, und Systemdienste legen ihre Einträge oft unter /etc/cron.d/ ab statt in einer Benutzer-Crontab.

Schritt für Schritt mit Beispielen: Cronjob unter Linux einrichten.

Bei Cronjob.de gibt es diese Befehle nicht: Die Liste steht in Ihrem Konto, und geändert wird sie im Browser. Der Zeitplan dahinter ist derselbe, den crontab -e erwarten würde.

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-Zählung.
3 Tag des Monats 1-31 Der 31. wird in kurzen Monaten schlicht übersprungen.
4 Monat 1-12 Statt Zahlen gehen auch JAN bis DEC.
5 Wochentag 0-7 0 und 7 stehen beide für 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 eingeschränkt. Steht in allen fünf Feldern ein Stern, läuft der Job jede Minute. * * * * *
, Aufzählung Mehrere einzelne Werte, durch Komma getrennt und ohne Leerzeichen. 0,15,30,45 * * * *
- Bereich Von, bis, jeweils einschließlich der Grenzen. 9-17 meint also auch 9 und 17. 0 9-17 * * *
/ Schrittweite Jeder n-te Wert, gezählt 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 * * * Täglich um Mitternacht. @midnight bedeutet dasselbe.
@hourly 0 * * * * Jede Stunde zur vollen Stunde.
@reboot — Einmalig beim Start des Systems. Das hat keinen Zeitplan und lässt sich bei einem Dienst, der Adressen von außen 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 fünf 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 * * * Täglich um 0:05 Uhr. Fünf Minuten Versatz sind sinnvoll, weil um Punkt Mitternacht sehr viele Jobs starten.
0 3 * * * Täglich um 3 Uhr nachts.
15 2 * * * Täglich um 2:15 Uhr.
0 9-17 * * * Stündlich 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 prüfen.
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 zusätzlich an jedem Montag. Siehe Stolpersteine.

Stolpersteine

Tag des Monats und Wochentag werden mit ODER verknüpft

Das ist der häufigste Fehler überhaupt. Sobald in beiden Feldern etwas anderes als ein Stern steht, läuft der Job an jedem Tag, auf den eine der beiden Angaben passt, nicht nur wenn beide zutreffen. 0 12 1-7 * 1 läuft also an sieben Tagen am Monatsanfang und zusätzlich an jedem Montag. Wer wirklich den ersten Montag treffen will, lässt den Cron an allen Tagen 1 bis 7 laufen und bricht im Skript ab, wenn nicht Montag ist.

Die Schrittweite zählt 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. Gleichmäßige Abstände 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 außen aufgerufen wird, tritt das Problem nicht auf.

Zeitzone und Sommerzeit

Ein Cron rechnet in der Zeitzone des Systems. Bei der Umstellung auf Sommerzeit fällt eine Stunde aus, im Herbst kommt sie doppelt. Ein Job, der auf 2:30 Uhr steht, läuft im Frühjahr an einem Tag gar nicht und im Herbst zweimal. Wenn das stört, legen Sie den Job außerhalb 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 kümmert das nicht. Wer das verhindern will, setzt im Skript eine Sperre, etwa eine Datei, die zu Beginn angelegt und am Ende gelöscht wird, oder eine Sperre in der Datenbank.

L, W, ? und # gehören nicht zum Unix-Cron

Ausdrücke wie 0 0 L * ? für den letzten Tag des Monats stammen aus Quartz, dem Zeitplaner der Java-Welt. Der Unix-Cron kennt sie nicht und lehnt sie ab. Dort löst man den letzten Tag des Monats über 28-31 und eine Prüfung im Skript.

Begriffe

cron
Der Dienst, der auf Unix-Systemen im Hintergrund läuft und fällige Aufgaben startet. Der Name stammt vom griechischen chronos, Zeit.
Cron-Daemon
Der laufende Prozess des Dienstes, meist crond genannt. Er prüft jede Minute, welche Einträge fällig 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 für cron table. Bearbeitet wird sie mit crontab -e, angezeigt mit crontab -l.
Crontab-Ausdruck
Die fünf 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. Nützlich auf Webspace ohne eigenen Cron oder wenn der Cron des Hosters zu grob ist.
Exit-Code
Die Rückmeldung eines Programms an das System. 0 heißt erfolgreich, alles andere bedeutet einen Fehler. Beim Aufruf über HTTP tritt an seine Stelle der Statuscode, etwa 200 für erfolgreich oder 500 für einen Fehler im Skript.
Standardausgabe
Alles, was ein Programm während des Laufs ausgibt, in der Unix-Welt stdout und stderr genannt. Ein echter Cron schickt das per Mail an den Benutzer. Bei einem Aufruf über HTTP ist es schlicht das, was die Seite zurückgibt.
Sperre
Eine Markierung, die verhindert, dass ein Job zweimal gleichzeitig läuft. Meist eine Datei oder ein Eintrag in der Datenbank, gesetzt beim Start und entfernt am Ende.
Überlappung
Der Fall, dass ein neuer Lauf beginnt, während 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, prüft das mit timedatectl oder date.
UTC
Die koordinierte Weltzeit, ohne Sommerzeit. Server laufen oft in UTC, damit Zeitpläne keine Umstellung mitmachen. Deutschland liegt eine Stunde davor, im Sommer zwei.
wget und curl
Zwei Kommandozeilenprogramme, die eine Adresse abrufen. Sie sind der übliche Weg, wenn ein Cron auf dem eigenen Server eine Seite aufrufen soll.
Task Scheduler
Das Gegenstück unter Windows, auch Aufgabenplanung genannt. Es kennt die Crontab-Syntax nicht, sondern wird über eine eigene Oberfläche 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 · Cronjob-Dienste im Vergleich · Cronjobs von 2003 bis heute

Von Joscha Schultze, Betreiber von Cronjob.de · Erstellt mit Unterstützung von KI.