Zum Hauptinhalt springen

← Zurück zum Blog

Cron-Ausdrücke erklärt: Die 5 Felder und häufige Beispiele

Cron ist die Art, wie Unix-artige Systeme wiederkehrende Jobs planen, und sein Ausdrucksformat taucht weit über crontab hinaus auf — in CI-Pipelines, Kubernetes-CronJobs und Cloud-Schedulern. Die Syntax wirkt zunächst kryptisch, ist aber nur fünf durch Leerzeichen getrennte Felder.

Was unser Werkzeug zum häufigsten Zeitplan sagt. Gib 0 9 * * 1-5 in den Cron-Generator ein, und er liest den Ausdruck Feld für Feld zurück:

Minute: 0
Hour: 9
Day of month: every
Month: every
Day of week: Mon-Fri

Zwei klassische Stolpersteine werden hier sichtbar. Tag-des-Monats und Wochentag stehen beide auf every; sind beide unbeschränkt, läuft der Job einfach täglich — beschränkt man aber beide, verhalten sie sich als OR, nicht als AND. Das ist der häufigste Cron-Fehler überhaupt. Und 1-5 ist Montag bis Freitag, weil die Woche bei 0 = Sonntag beginnt.

Die fünf Felder

┌── Minute (0–59)
│ ┌── Stunde (0–23)
│ │ ┌── Tag des Monats (1–31)
│ │ │ ┌── Monat (1–12)
│ │ │ │ ┌── Wochentag (0–7, 0 und 7 = Sonntag)
│ │ │ │ │
* * * * *

Jedes Feld beantwortet „bei welchen Werten läuft das?”. Ein * bedeutet „jeder”. * * * * * läuft also jede einzelne Minute.

Syntax innerhalb eines Feldes

  • * — jeder Wert.
  • 5 — genau 5.
  • 1-5 — ein Bereich, 1 bis 5.
  • */15 — ein Schritt: jeder 15. Wert (0, 15, 30, 45).
  • 1,15,30 — eine Liste bestimmter Werte.
  • Namen — JAN–DEC für Monate, SUN–SAT für Wochentage.

Einsatzfertige Beispiele

AusdruckBedeutung
* * * * *Jede Minute
*/5 * * * *Alle 5 Minuten
0 * * * *Jede Stunde, zur vollen Stunde
0 9 * * *Täglich um 09:00
0 9 * * 1-5Werktags um 09:00
0 0 * * 0Jeden Sonntag um Mitternacht
0 0 1 * *Am 1. jedes Monats
30 3 1 1 *03:30 am 1. Januar

Jede Lesart unten stammt aus unserem Cron-Generator — er zerlegt die fünf Felder und gibt sie in Worten zurück, der schnellste Weg, ein verschobenes Feld zu bemerken.

AusdruckWas unser Tool daraus liest
* * * * *Minute: jede/r Stunde: jede/r Tag des Monats: jede/r Monat: jede/r Wochentag: jede/r
*/15 * * * *Minute: alle 15 Stunde: jede/r Tag des Monats: jede/r Monat: jede/r Wochentag: jede/r
0 * * * *Minute: 0 Stunde: jede/r Tag des Monats: jede/r Monat: jede/r Wochentag: jede/r
0 9 * * 1-5Minute: 0 Stunde: 9 Tag des Monats: jede/r Monat: jede/r Wochentag: Mo-Fr
30 3 * * 0Minute: 30 Stunde: 3 Tag des Monats: jede/r Monat: jede/r Wochentag: So
0 0 1 * *Minute: 0 Stunde: 0 Tag des Monats: 1 Monat: jede/r Wochentag: jede/r
0 0 * * 1Minute: 0 Stunde: 0 Tag des Monats: jede/r Monat: jede/r Wochentag: Mo
0 */2 * * *Minute: 0 Stunde: alle 2 Tag des Monats: jede/r Monat: jede/r Wochentag: jede/r

Die eine Falle: Tag des Monats vs. Wochentag

Wenn beide Felder — Tag des Monats und Wochentag — eingeschränkt sind (nicht *), läuft Cron, wenn eines passt — nicht beide. 0 0 13 * 5 feuert also am 13. und an jedem Freitag, nicht nur an Freitag, dem 13. Im Zweifel gegen echte Laufzeiten prüfen.

Die beiden Ausdrücke, über die alle stolpern, unterscheiden sich in einem Zeichen. 0 0 1 * * liest sich als Minute: 0 Stunde: 0 Tag des Monats: 1 Monat: jede/r Wochentag: jede/r — der erste Tag jedes Monats. 0 0 * * 1 als Minute: 0 Stunde: 0 Tag des Monats: jede/r Monat: jede/r Wochentag: Mo — jeden Montag. Feld 3 ist der Monatstag, Feld 5 der Wochentag; beide gesetzt ist in den meisten Implementierungen ein OR und kein AND, 0 0 1 * 1 läuft also am 1. und jeden Montag.

Vor dem Ausrollen prüfen

Am sichersten vertraust du einem Cron, wenn du die tatsächlichen Zeitpunkte siehst, zu denen er feuert. Der Cron-Ausdruck-Generator erklärt jedes Feld in Klartext und listet die nächsten Laufzeiten in deiner lokalen Zone — mit Ein-Klick-Vorlagen. Alles läuft im Browser.

Verwandte Tools

Kürzel-Strings

Die meisten Cron-Daemons akzeptieren benannte Kürzel statt der fünf Felder:

KürzelEntsprichtLäuft
@yearly (oder @annually)0 0 1 1 *Einmal im Jahr, 1. Jan
@monthly0 0 1 * *Am 1. jedes Monats
@weekly0 0 * * 0Jeden Sonntag
@daily (oder @midnight)0 0 * * *Täglich um Mitternacht
@hourly0 * * * *Jede Stunde
@reboot—Einmal beim Start

Achte auch auf Varianten mit anderer Feldzahl: Springs @Scheduled, Quartz und manche Cloud-Scheduler stellen ein Sekunden-Feld voran (sechs Felder), und AWS EventBridge nutzt eine Sechs-Feld-Form, die verbietet, Tag des Monats und Wochentag zugleich zu setzen. Ein Fünf-Feld-Ausdruck in einem Sechs-Feld-Parser ist um ein Feld verschoben.

Zeitzonen und Sommerzeit

Das klassische crontab hat kein Zeitzonen-Feld — es feuert in der lokalen Zeit des Daemons. Unter Linux überschreibst du das pro Datei mit einer Zeile CRON_TZ=UTC (oder TZ); die meisten Cloud-Scheduler bieten stattdessen ein Zeitzonen-Dropdown. Für alles, was über Regionen hinweg geteilt wird, ist UTC die sichere Voreinstellung, damit niemand über Offsets nachdenken muss.

Die Sommerzeit-Umstellung ist die klassische Falle. Beim Vorstellen der Uhr läuft ein Job in der übersprungenen Stunde (etwa 30 2 * * *) an dem Tag womöglich nicht; beim Zurückstellen kann ein Job in der wiederholten Stunde zweimal laufen. Lege kritische Jobs außerhalb des Fensters 01:00–03:00 oder betreibe sie in UTC. Wenn du auch mit Epoch-Zeiten hantierst, erklärt der komplette Leitfaden zu Unix-Timestamps, wie diese auf die Uhrzeit abbilden.

Kurzes FAQ

  • Lassen sich Bereiche und Schritte kombinieren? Ja — 0-30/10 bedeutet 0, 10, 20, 30.
  • Was heißt */2 im Stunden-Feld? Jede zweite Stunde: 0, 2, 4 … 22.
  • Holt Cron verpasste Läufe nach? Nein. Ist die Maschine zur geplanten Zeit aus, überspringt einfaches Cron sie — nutze anacron, wenn Nachholen zählt.