Die fünf Felder
Klassisches Cron, wie es Linux crontab, Kubernetes CronJobs und GitHub Actions nutzen, liest fünf Felder von links nach rechts. Jedes Feld legt die Werte fest, zu denen der Job laufen darf, und der Job läuft immer dann, wenn alle Felder zur aktuellen Zeit passen. Ein Sternchen steht für jeden beliebigen Wert.
| Position | Feld | Erlaubte Werte | Namen |
|---|---|---|---|
| 1 | Minute | 0 bis 59 | |
| 2 | Stunde | 0 bis 23 | |
| 3 | Tag des Monats | 1 bis 31 | |
| 4 | Monat | 1 bis 12 | JAN bis DEC |
| 5 | Wochentag | 0 bis 7 (0 und 7 sind Sonntag) | SUN bis SAT |
Hier ausprobieren: Cron-Ausdruck-Generator
Vollständige Tool-Seite öffnenSonderzeichen
Vier Zeichen decken fast jeden Zeitplan ab. Sie lassen sich innerhalb eines Felds kombinieren, zum Beispiel 1-5,10 oder 0-30/10.
| Zeichen | Bedeutung | Beispiel | Ergebnis |
|---|---|---|---|
| * | Jeder Wert | * im Stundenfeld | Jede Stunde |
| , | Eine Liste von Werten | 0,30 im Minutenfeld | In Minute 0 und 30 |
| - | Ein Bereich | 9-17 im Stundenfeld | Jede Stunde von 9 bis 17 Uhr |
| / | Eine Schrittweite | */15 im Minutenfeld | Alle 15 Minuten: 0, 15, 30, 45 |
| / nach einem Wert | Schrittweite ab einem Start | 5/20 im Minutenfeld | In Minute 5, 25 und 45 |
| @-Kurzform | Ein benannter Zeitplan | @daily | Gleich wie 0 0 * * * |
Häufige Zeitpläne
Diese Ausdrücke wurden mit dem Generator auf dieser Seite geprüft. Kopiere den, der deinem Bedarf am nächsten kommt, und pass die Zahlen an.
| Ausdruck | Läuft |
|---|---|
| * * * * * | Jede Minute |
| */5 * * * * | Alle 5 Minuten |
| */15 * * * * | Alle 15 Minuten |
| 0 * * * * | Zu Beginn jeder Stunde |
| 30 * * * * | Jede Stunde in Minute 30 |
| 0 */6 * * * | Alle 6 Stunden: 0:00, 6:00, 12:00, 18:00 Uhr |
| 0 0 * * * | Täglich um Mitternacht |
| 0 9 * * * | Täglich um 9:00 Uhr |
| 0 9,17 * * * | Täglich um 9:00 und 17:00 Uhr |
| 0 9 * * 1-5 | Um 9:00 Uhr von Montag bis Freitag |
| */10 9-17 * * 1-5 | Werktags alle 10 Minuten während der Bürozeit |
| 0 22 * * 0,6 | Um 22:00 Uhr am Samstag und Sonntag |
| 0 9 * * 1 | Jeden Montag um 9:00 Uhr |
| 0 0 1 * * | Am Ersten jedes Monats um Mitternacht |
| 0 0 1,15 * * | Am 1. und 15. jedes Monats |
| 0 0 1 */3 * | Am Ersten jedes dritten Monats (quartalsweise) |
| 0 0 1 1 * | Einmal im Jahr, am 1. Januar um Mitternacht |
| 15 2 * * * | Jede Nacht um 2:15 Uhr |
| 0 12 * 6-8 * | Täglich um 12:00 Uhr im Juni, Juli und August |
| 0 8 1-7 * 1 | Vorsicht: Tag 1 bis 7 oder jeder Montag, siehe unten |
Tag des Monats und Wochentag zusammen
Das ist die Regel, über die die meisten stolpern. Sind beide Tagesfelder eingeschränkt, läuft klassisches Cron an Tagen, die zu einem der beiden passen, nicht zu beiden. 0 8 1-7 * 1 bedeutet also nicht den ersten Montag im Monat: Der Job läuft an den Tagen 1 bis 7 und zusätzlich an jedem Montag. Genauso läuft 0 0 13 * 5 an jedem 13. und an jedem Freitag, nicht nur an Freitag, dem 13.
Dazu kommt eine weitere Besonderheit: Beginnt eines der beiden Felder mit einem Sternchen, wie bei */2, behandelt Cron es für diese Regel als uneingeschränkt, und beide Felder müssen passen. 0 0 */2 * 1 läuft daher nur an Montagen, die auf einen ungeraden Tag des Monats fallen. Der Generator auf dieser Seite weist in seiner Erklärung auf beide Fälle hin.
Um bei klassischem Cron am ersten Montag zu laufen, plane den Job für Montage und lass das Skript abbrechen, wenn der Tag des Monats größer als 7 ist. Quartz kann das direkt mit 2#1 ausdrücken.
Zeitzonen und Zeitumstellung
Cron läuft in der Zeitzone des Rechners oder Dienstes, der es ausführt. Viele Server und Cloud-Dienste nutzen UTC, Zeitpläne in GitHub Actions sind immer UTC, und Kubernetes CronJobs nutzen die Zeitzone des Controllers, solange du das Feld timeZone nicht setzt. Manche Cron-Daemons lesen außerdem eine Variable CRON_TZ in der crontab.
In Zeitzonen mit Sommerzeit gibt es eine Nacht im Jahr ohne 2:30 Uhr und eine andere mit 1:30 Uhr zweimal; in Deutschland, Österreich und der Schweiz betrifft das die Stunde zwischen 2 und 3 Uhr. Die meisten Linux-Cron-Daemons holen Jobs aus der übersprungenen Stunde direkt nach der Umstellung nach und führen Jobs mit fester Uhrzeit in der doppelten Stunde nur einmal aus, während stündliche Jobs in beiden laufen. Andere Scheduler lassen die Ausführung stattdessen aus. Muss ein Job genau einmal am Tag laufen, plane ihn außerhalb der Zeit zwischen 1:00 und 3:00 Uhr oder betreib den Scheduler in UTC. Die Liste der Ausführungen im Generator markiert jede Ausführung, die auf eine Zeitumstellung fällt.
Sekunden, Quartz und Spring
Java- und manche JavaScript-Scheduler setzen ein Sekundenfeld an den Anfang, ihre Ausdrücke haben also sechs Felder: 0 */5 * * * * läuft alle fünf Minuten in Sekunde 0. Quartz geht weiter und ändert mehrere Regeln, deshalb scheitert ein klassischer Ausdruck dort oft.
- Quartz hat 6 oder 7 Felder: Sekunden, Minute, Stunde, Tag des Monats, Monat, Wochentag und ein optionales Jahr.
- Wochentage werden von 1 bis 7 gezählt, beginnend mit Sonntag, MON ist also 2. Namen wie MON-FRI vermeiden die Verwirrung.
- Eines der beiden Tagesfelder muss ? sein, das heißt kein bestimmter Wert. 0 0 9 ? * MON-FRI läuft werktags um 9:00 Uhr.
- L steht für last, also letzter: L im Feld Tag des Monats ist der letzte Tag des Monats, 6L im Feld Wochentag der letzte Freitag.
- W wählt den nächstgelegenen Werktag: 15W läuft am Werktag, der dem 15. am nächsten liegt, LW am letzten Werktag des Monats.
- # wählt den n-ten Wochentag: 6#3 ist der dritte Freitag im Monat.
- @Scheduled in Spring nutzt ebenfalls sechs Felder mit den Sekunden vorne, zählt die Wochentage aber wie klassisches Cron von 0 bis 7 und verlangt kein ?.
Fehler, die du vermeiden solltest
- * * * * * schreiben, wenn du einmal am Tag meinst. Das erste Feld ist die Minute, der Job läuft also 1440 Mal am Tag.
- Erwarten, dass */7 im Feld Tag des Monats alle sieben Tage bedeutet. Es bedeutet die Tage 1, 8, 15, 22 und 29 und beginnt am 1. wieder von vorn.
- Den 31., 30. oder 29. einplanen. Monate ohne diesen Tag werden übersprungen, nicht auf den letzten Tag verschoben.
- Die Zeitzone vergessen. 0 9 * * * auf einem UTC-Server läuft um 9:00 Uhr UTC, in Deutschland also um 10:00 oder 11:00 Uhr, je nach Sommer- oder Winterzeit, und anderswo vielleicht mitten in der Nacht.
- Quartz-Funktionen wie L oder ? in einer Linux-crontab verwenden oder einen Ausdruck mit fünf Feldern in Quartz. Der Generator wandelt beim Wechsel zwischen den Syntaxen um.