Wie man einen Cron-Ausdruck liest
Cron ist die Zeitplanungssyntax von Linux und der großen Mehrheit der Job-Scheduler. Sie besteht aus mehreren durch Leerzeichen getrennten Feldern, von denen jedes eine Dimension der Zeit beschreibt. Der Schlüssel zum Lesen ist nicht, Syntax auswendig zu lernen, sondern zu begreifen, dass die Felder durch „und" verbunden sind. Der Job läuft nur, wenn alle Felder gleichzeitig passen.
Was die fünf Felder sind
- Feld 1 — Minute: 0–59
- Feld 2 — Stunde: 0–23 im 24-Stunden-Format, 15 Uhr wird also als 15 geschrieben
- Feld 3 — Tag des Monats: 1–31
- Feld 4 — Monat: 1–12
- Feld 5 — Wochentag: 0–7, wobei 0 und 7 beide für Sonntag stehen (manche Implementierungen machen 1 zum Montag, also aufpassen)
Unterstützt der Scheduler Sekundengenauigkeit (Springs @Scheduled(cron=...), Quartz), wird ein Sekunden-Feld vorangestellt, sodass sechs Felder entstehen. Deshalb kann derselbe Ausdruck an verschiedenen Stellen „öfter als erwartet laufen" — ein Fünf-Feld-Muster, als sechs geparst, verschiebt jedes Feld um eins.
Die fünf Notationen
- Ein konkreter Wert:
30bedeutet die 30. Minute. - Ein Bereich:
9-18trifft 9 bis 18 einschließlich beider Enden. - Eine Liste:
1,3,5bedeutet jeder dieser drei Werte. - Eine Schrittweite:
*/5bedeutet jeder 5. Wert ab dem Anfang;10-40/5bedeutet alle 5 Minuten von 10 bis 40. - Ein Platzhalter:
*bedeutet „in diesem Feld ist alles erlaubt".
Diese lassen sich mischen, also bedeutet 0,30 9-17 * * 1-5 „zur vollen und halben Stunde, zwischen 9 und 17 Uhr, Montag bis Freitag".
Ein echter Ausdruck Schritt für Schritt
Nehmen wir */5 9-18 * * 1-5 Feld für Feld:
- Minute
*/5: alle 5 Minuten (0, 5, 10 … 55) - Stunde
9-18: 9 bis 18 Uhr - Tag
*: jedes Datum - Monat
*: jeder Monat - Wochentag
1-5: Montag bis Freitag
Zusammengelesen: „alle 5 Minuten von 9:00 bis 18:55 an Werktagen". Daten während der Geschäftszeiten häufig zu aktualisieren und nach Geschäftsschluss zu stoppen, ist ein sehr verbreitetes Muster.
Die drei Fallen, in die man am häufigsten tappt
- Sind „Tag des Monats" und „Wochentag" beide eingeschränkt, gilt „oder", nicht „und". Das ist die kontraintuitivste Regel in cron.
0 0 13 * 5ist vielleicht als „der 13., wenn es ein Freitag ist" gemeint, bedeutet aber tatsächlich „der 13. des Monats oder jeden Freitag" — mehr als zehnmal so oft. Um „und" auszudrücken, braucht es einen anderen Ansatz oder eine Prüfung im Skript. */nnicht für einen exakten Zeitraum über die 24-Stunden-Grenze verwenden.*/7im Minutenfeld ist wirklich 0, 7, 14 … 56, und dann beginnt die nächste Stunde bei 0 — nach Minute 56 vergehen also nur 4 Minuten. Für einen strikten Zeitraum (genau alle 7 Minuten) nutzen Sie das Sekundenfeld oder einen eigenen Scheduler.- Es gibt kein Jahresfeld. Standard-cron kann „nur im Jahr 2026" nicht ausdrücken. Begrenzen Sie das Jahr im Skript des Jobs, oder nutzen Sie eine erweiterte Syntax, die es unterstützt (Quartz tut das; Standard-crontab nicht).
Worin es sich von systemd-Timern unterscheidet
Auf modernem Linux können Sie statt crontab systemd-Timer verwenden. Die Syntax unterscheidet sich: crontab ist eine Zeile, während systemd sowohl eine .service- als auch eine .timer-Datei braucht. Die Vorteile von systemd sind ein lesbareres Format wie OnCalendar, eine Aufzeichnung des Ergebnisses des letzten Laufs und eine Nachholpolitik für verpasste Läufe (Persistent=true). Für Rechner, die nicht rund um die Uhr laufen, sind systemd-Timer zuverlässiger — cron führt schlicht keine Jobs aus, die es verpasst hat, während die Maschine aus war.
Auch Zeitzonen zählen: cron nutzt die lokale Zeit des Servers. Container verwenden meist UTC, also kann Ihr sorgfältig getestetes „täglich 8 Uhr" im Container 16 Uhr werden. Prüfen Sie nach dem Deployment immer die Zeitzoneneinstellung.
Wie man einen Ausdruck überprüft
Nicht im Kopf. Fügen Sie den Ausdruck in das Feld oben ein, und das Werkzeug listet die nächsten 10 Laufzeiten. Die Zeiten zu prüfen ist die schnellste Überprüfung überhaupt — und sie legt Fallen wie das ODER von Tag/Wochentag auf einen Blick offen: Schreiben Sie 0 0 13 * 5, enthalten die gelisteten Zeiten sowohl jeden 13. des Monats als auch jeden Freitag, und das Problem ist sofort offensichtlich.
Das Parsen geschieht vollständig in Ihrem Browser, ohne Netzwerkzugriff.
Häufige Fragen
Welche Zeit ist 0 6 * * *?
Täglich 6 Uhr. Das erste Feld 0 bedeutet Minute null, das zweite Feld 6 bedeutet 6 Uhr, und die übrigen drei sind Platzhalter ohne Einschränkung. Es ist eines der verbreitetsten Muster überhaupt.
Werden Makros im Stil von @daily unterstützt?
Standard-crontab unterstützt eine Reihe von Makros: @daily (Mitternacht jeden Tag), @hourly, @weekly, @monthly, @yearly, @reboot (einmal nach dem Start). Dieses Werkzeug konzentriert sich auf standardmäßige numerische Ausdrücke; ersetzen Sie das Makro selbst — @daily ist 0 0 * * *.
Warum funktioniert 7 für den Wochentag?
Weil sowohl 0 als auch 7 als Sonntag definiert sind, funktioniert beides. Für Montag verwenden Sie jedoch 1 — schreiben Sie nicht 8. Manche Systeme definieren den Wochentag als 1 bis 7 mit 1 als Sonntag, also immer nachfragen, wenn Sie die Plattform wechseln.
Die vorhergesagten Zeiten passen nicht zum tatsächlichen Lauf?
Prüfen Sie zuerst die Zeitzone. Container und Cloud-Funktionen verwenden meist UTC, das sind 8 Stunden Abstand zur Pekinger Zeit. Bestätigen Sie als Nächstes, ob der Scheduler fünf oder sechs Felder erwartet — ein hinzugefügtes oder fehlendes verschiebt die ganze Zeichenkette.
Kann es jede Laufzeit des nächsten Jahres berechnen?
Dieses Werkzeug listet standardmäßig 10, was reichlich ist, um die Logik zu validieren. Um Summen zu bilden (etwa zur Einschätzung der Joblast), nutzen Sie die Analysetools des Schedulers selbst oder berechnen es serverseitig.