Cron-Spickzettel: Cron-Ausdrücke verstehen

Ein Cron-Ausdruck besteht aus fünf durch Leerzeichen getrennten Feldern: Minute, Stunde, Tag des Monats, Monat und Wochentag. 0 9 * * 1-5 bedeutet um 9:00 Uhr von Montag bis Freitag. Dieser Spickzettel erklärt die Syntax, die meistgenutzten Zeitpläne und die Regeln, die selbst erfahrene Entwickler überraschen. Füge einen beliebigen Ausdruck in den Generator auf dieser Seite ein, um ihn in Klartext zu lesen und seine nächsten Ausführungszeiten zu sehen.

6 Min. Lesezeit

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.

PositionFeldErlaubte WerteNamen
1Minute0 bis 59
2Stunde0 bis 23
3Tag des Monats1 bis 31
4Monat1 bis 12JAN bis DEC
5Wochentag0 bis 7 (0 und 7 sind Sonntag)SUN bis SAT

Hier ausprobieren: Cron-Ausdruck-Generator

Vollständige Tool-Seite öffnen

Sonderzeichen

Vier Zeichen decken fast jeden Zeitplan ab. Sie lassen sich innerhalb eines Felds kombinieren, zum Beispiel 1-5,10 oder 0-30/10.

ZeichenBedeutungBeispielErgebnis
*Jeder Wert* im StundenfeldJede Stunde
,Eine Liste von Werten0,30 im MinutenfeldIn Minute 0 und 30
-Ein Bereich9-17 im StundenfeldJede Stunde von 9 bis 17 Uhr
/Eine Schrittweite*/15 im MinutenfeldAlle 15 Minuten: 0, 15, 30, 45
/ nach einem WertSchrittweite ab einem Start5/20 im MinutenfeldIn Minute 5, 25 und 45
@-KurzformEin benannter Zeitplan@dailyGleich 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.

AusdruckLä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-5Um 9:00 Uhr von Montag bis Freitag
*/10 9-17 * * 1-5Werktags alle 10 Minuten während der Bürozeit
0 22 * * 0,6Um 22:00 Uhr am Samstag und Sonntag
0 9 * * 1Jeden 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 * 1Vorsicht: 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.

Schritt für Schritt

  1. Syntax wählenWähle Standard für crontab, Kubernetes und GitHub Actions, Mit Sekunden für Scheduler mit Sekundenfeld oder Quartz.
  2. Mit einem Zeitplan startenKlick auf einen der häufigen Zeitpläne oder füge deinen eigenen Ausdruck in das Feld Cron-Ausdruck ein.
  3. Felder anpassenStell im Formular jedes Feld auf Jede, Alle n, Bestimmte oder Bereich.
  4. Erklärung lesenPrüf den Satz und die Hinweise unter dem Ausdruck. Sie warnen auch vor der Regel für die Tagesfelder.
  5. Nächste Ausführungen prüfenWähle die Zeitzone deines Servers und sieh dir die nächsten 10 Ausführungen an, bevor du den Ausdruck kopierst.

Häufige Fragen

Wie lasse ich einen Cronjob alle 5 Minuten laufen?

Mit */5 * * * *. Er läuft in Minute 0, 5, 10 und so weiter jeder Stunde.

Wie lasse ich einen Job werktags um 9 Uhr morgens laufen?

Mit 0 9 * * 1-5. In Quartz lautet derselbe Zeitplan 0 0 9 ? * MON-FRI.

Kann Cron einen Job alle 30 Sekunden ausführen?

Klassisches Cron geht nicht unter eine Minute. Scheduler mit Sekundenfeld können das, zum Beispiel mit */30 * * * * *. In einer crontab ist ein üblicher Umweg, zwei Einträge anzulegen, von denen einer mit sleep 30 beginnt.

Was ist der Unterschied zwischen 0 und 7 im Feld Wochentag?

Bei klassischem Cron keiner: Beide bedeuten Sonntag. Quartz nutzt 1 für Sonntag und 7 für Samstag.

Warum lief mein Job an einem Tag, mit dem ich nicht gerechnet habe?

Meist weil beide Tagesfelder gesetzt waren und Cron an Tagen lief, die zu einem der beiden passen, oder weil der Server eine andere Zeitzone nutzt. Füge den Ausdruck in den Generator ein, dann siehst du beides.

Wird der Ausdruck irgendwohin gesendet, wenn ich ihn teste?

Nein. Die Erklärung und die Ausführungszeiten werden in deinem Browser berechnet.