Zum Inhalt springen
Toolbrik
Zurück zum Blog

Cron-Spickzettel: Syntax und 20 Beispiele zum Kopieren

5 Min. LesezeitVerwandtes Tool: Cron-Ausdruck-Parser

Cron ist der Job-Scheduler von Unix-Systemen, und seine Syntax hat sich überall eingeschlichen: Linux-Server, Kubernetes, GitHub Actions, Serverless-Funktionen, Laravel, Spring … Sie zu lernen dauert zehn Minuten. Sie zu vergessen noch weniger. Dieser Spickzettel ist zum Griffbereit-Halten gedacht.

Die fünf Felder

Ein klassischer Cron-Ausdruck besteht aus fünf durch Leerzeichen getrennten Feldern:

┌───────────── Minute (0–59)
│ ┌─────────── Stunde (0–23)
│ │ ┌───────── Tag des Monats (1–31)
│ │ │ ┌─────── Monat (1–12 oder JAN–DEC)
│ │ │ │ ┌───── Wochentag (0–7 oder SUN–SAT; 0 und 7 sind Sonntag)
│ │ │ │ │
* * * * *  Befehl

Jedes Feld akzeptiert diese Operatoren:

Zeichen Bedeutung Beispiel Gelesen als
* jeder Wert * * * * * jede Minute
, Liste 0 9,14 * * * um 9:00 und 14:00
- Bereich 0 9-17 * * * jede volle Stunde von 9 bis 17 Uhr
/ Schritt */15 * * * * alle 15 Minuten

20 Beispiele, die du brauchen wirst

Ausdruck Wann er läuft
* * * * * Jede Minute
*/5 * * * * Alle 5 Minuten
*/15 * * * * Alle 15 Minuten (:00, :15, :30, :45)
0 * * * * Jede volle Stunde
30 * * * * Jede Stunde um halb
0 */2 * * * Alle 2 Stunden
0 0 * * * Täglich um Mitternacht
0 8 * * * Täglich um 8:00
30 23 * * * Täglich um 23:30
0 9 * * 1-5 Montag bis Freitag um 9:00
0 10 * * 6,0 Samstags und sonntags um 10:00
0 9-18 * * 1-5 Werktags jede Stunde von 9 bis 18 Uhr
0 0 * * 0 Jeden Sonntag um Mitternacht
0 0 1 * * Am 1. jedes Monats
0 0 15 * * Am 15. jedes Monats
0 0 1 1 * Am 1. Januar (einmal im Jahr)
0 0 1 */3 * Am ersten Tag jedes Quartals
0 3 * * 1 Montags um 3:00 (ein Klassiker für Backups)
*/10 8-20 * * * Alle 10 Minuten zwischen 8:00 und 20:59
0 12 1-7 * 1 ⚠️ Nicht „der erste Montag im Monat“ (siehe unten)

Wenn du dir bei einem Ausdruck unsicher bist, füge ihn in den Cron-Parser ein: Er zeigt die nächsten Ausführungszeiten an. Und wenn du ihn lieber ohne Syntax zusammenklicken willst, erledigt das der Cron-Builder mit Auswahlfeldern und erklärt ihn in Klartext.

Die @-Kürzel

Linux-Cron (und die meisten seiner Ableger) akzeptiert lesbare Aliase; GitHub Actions und andere Cloud-Scheduler nicht:

Alias Entspricht
@yearly oder @annually 0 0 1 1 *
@monthly 0 0 1 * *
@weekly 0 0 * * 0
@daily oder @midnight 0 0 * * *
@hourly 0 * * * *
@reboot Beim Systemstart

Die 5 Fehler, die die meisten Jobs kaputt machen

1. Monatstag und Wochentag werden mit ODER verknüpft, nicht mit UND

Das ist die berühmteste Falle. Wenn du im klassischen Cron gleichzeitig Monatstag und Wochentag einschränkst, läuft der Job, sobald eines von beiden zutrifft. 0 12 1-7 * 1 heißt also nicht „erster Montag im Monat um 12 Uhr“, sondern „an den Tagen 1 bis 7 jedes Monats und zusätzlich jeden Montag“.

Die übliche Lösung: nur eines der beiden Felder setzen und im Befehl selbst filtern:

0 12 1-7 * * [ "$(date +\%u)" = 1 ] && /pfad/skript.sh

(In einer Crontab muss % als \% maskiert werden: ohne Backslash interpretiert Cron es als Zeilenumbruch.)

2. Die Zeitzone ist nicht die, die du denkst

Cron nutzt die Zeitzone des Systems, auf dem es läuft. Auf einem Server in UTC läuft 0 9 * * * um 9:00 UTC – in Deutschland ist das im Winter 10:00 und im Sommer 11:00. Verwaltete Scheduler laufen meist in UTC: GitHub Actions nutzt immer UTC, und Kubernetes-CronJobs verwenden die Zeitzone des Controllers, sofern du im Spec kein timeZone angibst.

3. Die Zeitumstellung

Wenn du etwas zwischen 2:00 und 3:00 Uhr nachts planst, kann es am Tag der Zeitumstellung ausfallen (im Frühjahr gibt es diese Stunde nicht) oder je nach Implementierung doppelt laufen (im Herbst wiederholt sie sich). Für kritische Jobs meide dieses Fenster oder arbeite in UTC.

4. Schritte laufen nicht über die Stunde hinaus

*/7 * * * * läuft nicht im strengen Sinne „alle 7 Minuten“: Er läuft in den Minuten 0, 7, 14 … 56, und in der nächsten Stunde beginnt er wieder bei 0. Zwischen Minute 56 und 0 liegen nur 4 Minuten. Für Intervalle, die 60 nicht teilen, ist Cron das falsche Werkzeug.

5. Fünf oder sechs Felder

Klassischer Cron hat fünf Felder und eine Auflösung von einer Minute. Quartz, Spring (@Scheduled) und Bibliotheken wie node-cron fügen am Anfang ein sechstes Feld für Sekunden hinzu: 0 */5 * * * * bedeutet in Spring „alle 5 Minuten“, ist in einer Crontab aber ungültig. Wenn du einen Ausdruck von einem System ins andere kopierst, zähle die Felder.

So prüfst du einen Ausdruck vor dem Deployment

Die zuverlässigste Methode ist, sich die tatsächlichen nächsten Ausführungen anzusehen. Füge den Ausdruck in den Cron-Parser ein, wähle je nach System 5 oder 6 Felder und prüfe die Liste: Läuft dein „erster Montag im Monat“ auch am 3., bist du in Fehler Nummer 1 getappt. Alles wird in deinem Browser berechnet – probiere so viele Ausdrücke aus, wie du willst.