Technik · 24. August 2026

Cron-Ausdrücke Referenz — jedes Beispiel, das Sie wirklich brauchen

Jede Minute, jeden Wochentag um 9 Uhr, ersten des Monats, letzten Freitag — Cron-Ausdrücke zum Kopieren mit Erklärungen, was jedes Feld macht.

Ein Cron-Ausdruck ist die prägnanteste Möglichkeit, einem Computer zu sagen “führe diese Aufgabe nach diesem Zeitplan aus”. Fünf Felder, alles Zahlen und Sonderzeichen, kein Spielraum für Missverständnisse, sobald man die Syntax gelernt hat. Das Problem: Es gibt etwa fünfzehn gängige Muster, die Sie tatsächlich brauchen, und den Rest der Zeit starren Sie auf eine crontab -e-Aufforderung und versuchen sich daran zu erinnern, ob Sonntag 0 oder 7 ist.

Dieser Beitrag ist die Spickzettel, die ich mir vor fünf Jahren gewünscht hätte. Jedes gängige Muster mit einem kopierbaren Ausdruck, einer Erklärung und einem Hinweis zu der Fallstricke, die Leute erwischen.

Die fünf Felder

* * * * *
│ │ │ │ │
│ │ │ │ └── Wochentag (0-6, Sonntag=0)
│ │ │ └──── Monat (1-12)
│ │ └────── Tag des Monats (1-31)
│ └──────── Stunde (0-23)
└────────── Minute (0-59)

Jedes Feld kann sein:

  • Ein bestimmter Wert: 5
  • Ein Platzhalter: * (jeder Wert)
  • Ein Bereich: 1-5
  • Ein Schritt: */15 (alle 15)
  • Eine Liste: 1,15,30
  • Ein Bereich mit Schritt: 1-30/5 (alle 5 zwischen 1 und 30)

Das war’s. Der Rest ist das Kombinieren dieser Grundbausteine.

Die Muster

Jede Minute

* * * * *

Anwendungsfall: Ein Job, der immer laufen soll, und der Scheduler spawnt ihn einfach neu. Selten das, was Sie wollen.

Alle N Minuten

*/5 * * * *      # alle 5 Minuten
*/15 * * * *     # alle 15 Minuten
*/30 * * * *     # alle 30 Minuten

*/5 bedeutet “beginnend bei 0, alle 5 Minuten”. Also 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55.

Fallstrick: Der erste Lauf von */5 ist bei Minute 0, nicht zum Zeitpunkt, als Sie die crontab gespeichert haben. Wenn Sie sie um 12:03 speichern, ist der erste Lauf 12:05, nicht 12:08.

Jede Stunde auf die Minute

0 * * * *

Fallstrick: Das ist “Minute 0 jeder Stunde”, also 1:00, 2:00, 3:00 usw. Wenn Sie “jede Stunde, 30 Minuten nach” wollen, verwenden Sie 30 * * * *.

Jeden Tag um Mitternacht

0 0 * * *

Fallstrick: Die Zeitzone des Servers. cron verwendet die Systemzeitzone. Wenn Ihr Server in UTC liegt und Sie Mitternacht nach US Eastern wollen, müssen Sie umrechnen. Die sauberste Lösung: Konfigurieren Sie die Systemzeitzone auf Ihren Wunsch, oder setzen Sie die Umgebungsvariable CRON_TZ (von den meisten modernen cron-Implementationen unterstützt).

Jeden Tag zu einer bestimmten Zeit

0 9 * * *       # 9:00 Uhr
30 14 * * *     # 14:30 Uhr
0 0 * * *       # Mitternacht
15 3 * * *      # 3:15 Uhr

Jeden Werktag um 9 Uhr

0 9 * * 1-5

1-5 ist der Wochentag, Montag bis Freitag.

Fallstrick: 0 und 7 bedeuten beide Sonntag. Die POSIX-Spezifikation akzeptiert beide. Die meisten Implementationen sind nachsichtig, wenn Sie versehentlich 7 verwenden. Verlassen Sie sich darauf nicht.

Jeden Montag

0 0 * * 1

Mitternacht jeden Montag.

Zweimal pro Woche (Mo und Do)

0 9 * * 1,4

9 Uhr am Montag und Donnerstag.

Ersten Tag jedes Monats

0 0 1 * *

Mitternacht am 1.

Letzter Tag des Monats

0 0 L * *

L ist eine Vixie cron / Quartz-Erweiterung. Standard-cron hat das nicht. Wenn Sie Standard-cron verwenden, müssen Sie “letzter Tag”-Annäherungen wie 0 0 28-31 * * verwenden (was am 28., 29., 30. und 31. läuft, und am 28. Februar).

Jedes Quartal

0 0 1 */3 *

Mitternacht am 1. Januar, April, Juli, Oktober.

Jeden Sonntag um Mittag

0 12 * * 0

Alle 6 Stunden

0 */6 * * *

0:00, 6:00, 12:00, 18:00.

Jede Minute zwischen 9 und 17 Uhr, Werktags

* 9-17 * * 1-5

Ein Job, der jede Minute von 9:00:00 bis 17:59:59 läuft, Montag bis Freitag. Wahrscheinlich zu aggressiv — aber möglich.

Um 2:30 Uhr am ersten eines jeden Monats

30 2 1 * *

Um 23 Uhr am letzten Freitag des Monats

0 23 * * 5#5

5#5 ist “5. Freitag des Monats” (Quartz-Syntax). # und L sind nicht-standardisierte Erweiterungen — Standard-cron hat keinen Ausdruck für “letzten Freitag des Monats”. Wenn Sie das in Standard-cron brauchen, brauchen Sie ein Wrapper-Skript, das das Datum prüft.

Alle 30 Sekunden

Standard-cron geht nicht unter 1 Minute. Für Sub-Minuten-Planung:

  • systemd-Timer: OnUnitActiveSec=30s
  • In Kubernetes CronJob: nicht möglich (Minimum 1 Minute). Verwenden Sie einen regulären Job mit sleep 30 in einer Schleife.
  • In einer Node.js-App: setInterval(fn, 30_000) innerhalb des Prozesses.

Sommerzeit

cron behandelt die Sommerzeit, indem der Job entweder zweimal ausgeführt wird (Frühjahrszeitumstellung) oder übersprungen wird (Herbstzeitumstellung), abhängig von der Implementation. Wenn Ihr Job zeitkritisch ist (eine Abrechnungslauf, ein Bericht), planen Sie ihn weit außerhalb des 1-3 Uhr-Fensters, um Sommerzeit-Überraschungen zu vermeiden.

Der Quartz-Planer behandelt das mit dem DST-Flag. Standard-cron nicht.

Die 1-Minuten-Granularitäts-Grenze

cron ist grundsätzlich ein Werkzeug mit 1-Minuten-Auflösung. Wenn Sie Sub-Minuten-Planung brauchen, lautet die Antwort “verwenden Sie ein anderes Werkzeug”. Speziell für Kubernetes:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: every-30-seconds
spec:
  schedule: "* * * * *"
  startingDeadlineSeconds: 10
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: worker
              image: myworker:latest
              command: ["/bin/sh", "-c", "for i in 1 2; do do_work; sleep 30; done"]

Dies führt den Job alle 30 Sekunden aus, indem pro Minute zwei Unter-Jobs gestartet werden. Knausig, aber es funktioniert.

Was ist mit Quarkus, EventBridge, Kubernetes CronJob?

Verschiedene Planer verwenden leicht unterschiedliche Cron-Syntax. Die fünf-Felder-Form ist die häufigste. Einige andere:

  • Quartz: sechs Felder (mit Sekunden) und der ?-Platzhalter für “kein bestimmter Wert”.
  • AWS EventBridge: sechs Felder, unterstützt die L- und #-Erweiterungen.
  • Kubernetes CronJob: fünf Felder, kein L- oder #-Support.
  • Spring @Scheduled: sechs Felder (mit Sekunden), ?- und L-Support.
  • GitHub Actions: fünf Felder, keine Erweiterungen.

Wenn Sie ein verwenden, das nicht mit dem Standard übereinstimmt, schauen Sie in die Dokumentation. Die meisten Muster in diesem Spickzettel lassen sich direkt übertragen. Die nicht-standardisierten Erweiterungen (L, #, W) nicht.

Cron-Ausdrücke generieren, ohne Syntax auswendig zu lernen

Wenn Sie die Syntax nicht auswendig lernen wollen, können Sie mit dem Cron-Generator auf DevSpeedTools durch die fünf Felder klicken und die nächsten fünf geplanten Läufe anzeigen lassen. Das ist der schnellste Weg zu überprüfen, ob 0 9 * * 1-5 wirklich 9 Uhr Werktage bedeutet — die Antwort ist ja, aber das Ansehen der nächsten Laufdaten macht das Muster konkret.

Für einmalige Ausdrücke ist crontab.guru die Standard-Referenz. Der Cron-Generator erledigt dasselbe und ist vollständig client-seitig, sodass die Ausdrücke, die Sie einfügen, nie Ihren Browser verlassen.

Die Zusammenfassung

Cron-Ausdrücke sind ein kleines DSL mit ein paar Regeln. Lernen Sie die fünf Felder, lernen Sie * (beliebig), - (Bereich), / (Schritt) und , (Liste), und Sie können 95% der Zeitpläne ausdrücken, die Sie jemals brauchen werden. Die anderen 5% brauchen planerspezifische Erweiterungen oder ein anderes Werkzeug. Im Zweifel generieren und Vorschau des Ausdrucks mit einem Tool, das die nächsten Läufe anzeigt — viel schneller als mentales Debugging.