Wie Sie Cron-Ausdrücke aufbauen
Cron-Ausdrücke sind die Standardweise, wiederkehrende Zeitpläne in Linux, Cloud-Plattformen, CI/CD-Pipelines und Task-Schedulern zu definieren. Die Syntax ist kompakt, aber nicht intuitiv: Ein visueller Cron-Generator zeigt Ihnen genau, wann Ihr Job läuft, fängt häufige Fehler vor dem Deployment ab und nimmt das Rätselraten aus dem fehleranfälligsten Teil der Automatisierung. Sobald Sie die fünf Felder, die Sonderzeichen und die häufigsten Fallstricke verstanden haben, können Sie jeden wiederkehrenden Zeitplan zuverlässig festlegen.
Eine kurze Geschichte des cron
Das erste cron stammt von Brian Kernighan in Version 7 Unix, um 1979. Es las jede Minute seine Konfiguration neu ein und führte aus, was fällig war. Paul Vixie schrieb es 1987 in das um, was heute Vixie cron heißt, die Version, die die meisten Linux-Distributionen noch ausliefern. Vixie cron fügte benutzerbezogene Crontabs, Umgebungsvariablen, das Schlüsselwort @reboot und mehrere Komfortfunktionen hinzu, die das Format auch für Nicht-Administratoren nutzbar machten.
Die 5-Feld-Syntax hat sich in über vierzig Jahren kaum verändert. Amazon EventBridge, Google Cloud Scheduler, Kubernetes CronJob, GitHub Actions, GitLab CI, Jenkins, Airflow, n8n und Dutzende anderer Systeme verarbeiten alle dasselbe kompakte Format mit nur kleinen Erweiterungen. Diese Stabilität ist der Grund, warum es sich lohnt, cron einmal zu lernen und nie wieder neu lernen zu müssen. Die Fähigkeit überträgt sich überall dorthin, wo Automatisierung nach Uhrzeit läuft.
Cron-Syntax
Ein Standard-Cron-Ausdruck hat 5 Felder, durch Leerzeichen getrennt. Jedes Feld steuert eine Zeitscheibe, und ein Job läuft, wenn jedes Feld zum aktuellen Moment passt.
┌───────────── Minute (0-59)
│ ┌───────────── Stunde (0-23)
│ │ ┌───────────── Tag des Monats (1-31)
│ │ │ ┌───────────── Monat (1-12 oder JAN-DEC)
│ │ │ │ ┌───────────── Wochentag (0-6, So=0, oder SUN-SAT)
│ │ │ │ │
* * * * *
Die Felder werden für Stunde, Minute und Monat per UND verknüpft, aber Tag-des-Monats und Wochentag werden in Vixie cron per ODER verknüpft. Das bedeutet, dass 0 12 1 * 1 sowohl am 1. jedes Monats ALS AUCH an jedem Montag mittags feuert, nicht nur an Montagen, die zufällig auf den 1. fallen. In diese Falle tappen fast alle beim ersten Mal.
Häufige Cron-Zeitpläne
Die Muster, zu denen Sie am häufigsten greifen werden:
| Zeitplan | Ausdruck | Bedeutung |
|---|---|---|
| Jede Minute | * * * * * | Läuft alle 60 Sekunden |
| Alle 5 Minuten | */5 * * * * | Um :00, :05, :10, :15... |
| Alle 15 Minuten | */15 * * * * | Um :00, :15, :30, :45 |
| Stündlich | 0 * * * * | Zur vollen Stunde |
| Alle 2 Stunden | 0 */2 * * * | Um 00:00, 02:00, 04:00... |
| Täglich um Mitternacht | 0 0 * * * | Einmal pro Tag um 00:00 |
| Täglich um 9 Uhr | 0 9 * * * | Einmal pro Tag um 09:00 |
| Zweimal täglich | 0 9,21 * * * | Um 09:00 und 21:00 |
| Jeden Montag 8 Uhr | 0 8 * * 1 | Wöchentlich montags |
| Werktags 18 Uhr | 0 18 * * 1-5 | Montag bis Freitag |
| 1. jedes Monats | 0 0 1 * * | Monatlich um Mitternacht am 1. |
| Jedes Quartal | 0 0 1 */3 * | 1. Jan, 1. Apr, 1. Jul, 1. Okt |
| Jeden Werktag morgens | 0 7 * * 1-5 | 07:00 Mo-Fr |
| Sonntag mittags | 0 12 * * 0 | Wöchentlich sonntags |
Viele Systeme akzeptieren auch Kurzaliase, die sich zum entsprechenden 5-Feld-Ausdruck entfalten: @yearly, @monthly, @weekly, @daily, @hourly und @reboot. Sie sind knapp, aber nicht universell; prüfen Sie also Ihre Plattform, bevor Sie sich darauf verlassen.
So bauen Sie einen Cron-Ausdruck
- Wählen Sie die Granularität: Brauchen Sie jede Minute, jede Stunde, einmal am Tag, einmal pro Woche oder einmal pro Monat? Starten Sie mit der gröbsten Einstellung, die Ihren Bedarf deckt.
- Nutzen Sie die visuellen Steuerelemente: Wählen Sie Werte für Minute, Stunde, Tag, Monat und Wochentag aus den Dropdowns. Oder starten Sie mit einer Voreinstellung wie «stündlich» oder «täglich um Mitternacht» und passen Sie an.
- Prüfen Sie die nächsten Laufzeiten in der Vorschau: Der Generator zeigt die nächsten 5 Ausführungszeiten, sodass Sie bestätigen können, dass der Zeitplan dann feuert, wann Sie es erwarten.
- Plausibilisieren Sie die Zeitzone: Die Vorschau sollte zur Zeitzone des Servers oder Schedulers passen, der den Job ausführen wird, nicht zu Ihrer lokalen Zeit.
- Kopieren Sie den Ausdruck und fügen Sie ihn in Ihre crontab, Ihr GitHub-Actions-YAML, Ihre AWS-EventBridge-Regel oder den verwendeten Scheduler ein.
- Testen Sie zuerst mit einem kurzen Intervall, bevor Sie den finalen Zeitplan festschreiben. Ein schnelles
*/5 * * * *beweist, dass der Job feuert; wenn Sie zwei oder drei Läufe sehen, tauschen Sie den echten Ausdruck ein.
Sonderzeichen und Operatoren
Cron unterstützt einen kleinen, aber mächtigen Satz von Operatoren innerhalb jedes Feldes.
| Zeichen | Bedeutung | Beispiel |
|---|---|---|
* | Jeder Wert | * * * * * = jede Minute |
*/n | Jedes n-te | */15 * * * * = alle 15 Min |
, | Mehrere diskrete Werte | 0 8,12,18 * * * = 8, 12, 18 Uhr |
- | Inklusiver Bereich | 0 9-17 * * * = stündlich 9-17 Uhr |
n-m/k | Bereich mit Schritt | 0 9-17/2 * * * = 9, 11, 13, 15, 17 |
? | Kein spezifischer Wert (nur Quartz) | 0 0 ? * MON (Java-Scheduler) |
L | Letzter (AWS, Quartz) | L im DoM = letzter Tag des Monats |
W | Nächster Werktag (AWS, Quartz) | 15W = Werktag nahe am 15. |
# | N-ter Wochentag (AWS, Quartz) | MON#2 = zweiter Montag des Monats |
@hourly | Kurzform | Gleich wie 0 * * * * |
Klassisches Vixie cron unterstützt nur die ersten fünf Zeilen. Die fortgeschrittenen Operatoren (L, W, #, ?) stammen aus Quartz, der Java-Scheduling-Bibliothek, und wurden von AWS EventBridge und einigen anderen Cloud-Schedulern übernommen. Sie sind nicht portabel, also mischen Sie sie nicht mit Code, der auf einer generischen Linux-Maschine laufen muss.
Cron auf verschiedenen Plattformen
Cron ist eine Familie verwandter Syntaxen, kein einzelner Standard. Zu wissen, welchen Dialekt Ihr Scheduler spricht, spart Stunden Debugging.
| Plattform | Felder | Hinweise |
|---|---|---|
| Vixie cron (Linux) | 5 | Der Klassiker. */n, Bereiche, Listen, keine fortgeschrittenen Operatoren |
| BSD cron | 5 | Wie Vixie, aber leichte Umgebungs-Unterschiede |
| crontab.guru | 5 | Web-Parser, der Vixie-Semantik spiegelt |
| GitHub Actions | 5 | Vixie-Syntax, läuft in UTC, mindestens 5-Minuten-Auflösung |
| GitLab CI | 5 | Vixie-Syntax, läuft in der Instanz-Zeitzone |
| AWS EventBridge | 6 | Fügt Jahr hinzu. Wochentag nutzt 1-7 (So=1), unterstützt L/W/# |
| Google Cloud Scheduler | 5 | Vixie-Syntax plus Zeitzonen-Konfiguration |
| Kubernetes CronJob | 5 | Vixie-Syntax mit @-Kürzeln |
| Quartz (Java) | 6 oder 7 | Fügt Sekunden vorn hinzu und optional ein Jahr |
| systemd-Timer | OnCalendar-Format | Kein cron, löst aber dasselbe Problem mit klarerer Syntax |
Wenn Sie einen Zeitplan schreiben, der auf mehr als einer Plattform laufen muss, halten Sie sich an die konservative 5-Feld-Teilmenge, die jedes System versteht. Greifen Sie nur dann zu L, W oder #, wenn Sie wissen, dass das Ziel sie unterstützt.
Häufige Fallstricke
- Tag-des-Monats und Wochentag sind ODER-verknüpft, ein Ausdruck wie
0 9 15 * 1feuert an jedem Montag UND am 15. jedes Monats, nicht nur an den 15., die auf einen Montag fallen. Für eine Schnittmenge brauchen Sie meist einen äußeren Wrapper oder einen anderen Scheduler. - Zeitzonen-Verwirrung, Server-Crontabs laufen fast immer in UTC. Wenn Sie 9 Uhr Ostküstenzeit wollen, ist das
0 14 * * *UTC im Winter, aber0 13 * * *UTC im Sommer wegen der Sommerzeit. Verwenden Sie einen Scheduler, der Zeitzonen-Hinweise unterstützt, oder normalisieren Sie alles auf UTC. - Sommerzeit-Umstellungen, Jobs, die für 02:30 lokal geplant sind, können bei Rückstellung doppelt laufen und bei Vorstellung gar nicht. Planen Sie sensible Jobs außerhalb des Fensters 01:00-03:00 oder verwenden Sie UTC.
- Die Vixie-
MAILTO-Falle, wenn Ihr Job etwas auf stdout druckt, mailt Vixie cron die Ausgabe an den Benutzer, dem die crontab gehört. Auf Servern ohne Mail-Relay füllt das/var/spool/mailschnell. Leiten Sie die Ausgabe mit>>/var/log/myjob.log 2>&1in eine Logdatei um. - Die Umgebung ist nicht Ihre Login-Shell, cron läuft mit einer abgespeckten Umgebung: kein
PATHaus Ihrer.bashrc, kein virtualenv, keinnvm. Setzen Sie die benötigten Variablen oben in der crontab oder rufen Sie Ihr Skript mit absolutem Pfad auf. - Prozentzeichen müssen escapt werden, ein nicht escaptes
%in einer Vixie-crontab wird im Befehl als Zeilenumbruch interpretiert. Escapen Sie es immer als\%, wenn Ihr Befehl ein wörtliches Prozentzeichen braucht, etwa in einemdate +"%Y-%m-%d"-Aufruf. - Lang laufende Jobs überlappen sich, cron überspringt keinen Lauf, weil der vorherige noch läuft. Wenn Ihr Job länger als das Intervall dauern kann, wickeln Sie ihn in eine Lockdatei (
flock,setlock) oder verwenden Sie einen Runner, der Nebenläufigkeit behandelt. - Überlauf bei 59 Minuten,
*/40 * * * *feuert nicht alle 40 Minuten. Es feuert in Minute 0 und 40 jeder Stunde, weil Schrittwerte an den Feldgrenzen umlaufen. Für echte 40-Minuten-Intervalle brauchen Sie einen reicheren Scheduler. - Das
0im Minutenfeld vergessen,* 9 * * *läuft jede Minute von 09:00 bis 09:59, nicht einmal um 09:00. Das Minutenfeld braucht einen expliziten Wert, wenn Sie nur einen Schuss pro Stunde wollen. - Cron ist auf Laptops unzuverlässig, anacron existiert genau aus diesem Grund. Vixie cron holt verpasste Läufe nach einem Sleep nicht nach, also läuft ein für 03:00 geplantes Backup nicht, wenn der Laptop zu dieser Zeit zugeklappt war. Verwenden Sie anacron, systemd-Timer mit
Persistent=trueoder eine launchd-plist auf macOS.
Alternativen zu cron
Für manche Workloads beginnt die grobe Minutenauflösung von cron und das Fehlen einer Buchführung weh zu tun. Die häufigsten Upgrades:
| Werkzeug | Stärke | Wann wählen |
|---|---|---|
| systemd-Timer | Klare OnCalendar-Syntax, persistent über Neustarts, integriert mit Units | Sie nutzen ohnehin systemd und wollen reichhaltigeres Logging |
| Anacron | Holt verpasste Läufe nach Sleep nach | Laptops oder Maschinen, die nicht immer eingeschaltet sind |
| Airflow / Dagster | DAG-Abhängigkeiten, Retries, Beobachtbarkeit | Mehrstufige Datenpipelines |
| Temporal | Zustandsbehaftete Workflows, Exactly-once-Garantien | Lang laufende Orchestrierung über Dienste hinweg |
| AWS EventBridge | Verwaltet, integriert mit Lambda, S3, SQS | Alles Cloud-Native auf AWS |
| GitHub Actions | Kostenlos für öffentliche Repos, läuft auf gehosteten Runnern | CI-nahe geplante Jobs |
| Serverless-Funktionen mit Cron-Triggern | Kein Server zu warten | Leichte Aufgaben, die in ein Lambda passen |
Cron bleibt für die große Mehrheit einmaliger wiederkehrender Jobs die richtige Antwort. Die anderen Werkzeuge glänzen, wenn Sie Zustand, Retries, Abhängigkeiten oder Koordination über Maschinen hinweg brauchen.
Datenschutz und der Cron-Generator
Der Cron-Ausdrucksgenerator läuft vollständig in Ihrem Browser. Der Zeitplan, den Sie bauen, die Vorschau der nächsten Laufzeiten und der kopierte Ausdruck berühren unsere Server nie. Es gibt kein Log darüber, welche Ausdrücke generiert wurden, keine Telemetrie darüber, welche Voreinstellungen beliebt sind, und keine Möglichkeit für irgendjemanden, den Zeitplan zu rekonstruieren, an dem Sie gearbeitet haben. Cron-Ausdrücke sind auf den ersten Blick keine persönlichen Daten, aber der Zeitplan eines Jobs (ein nächtlicher Datenbankexport, ein wöchentlicher Abrechnungslauf, eine stündliche Synchronisation mit einem Partner) kann viel darüber verraten, wie ein Geschäft arbeitet. Diese Information clientseitig zu halten, vermeidet das versehentliche Durchsickern von Infrastrukturmustern an Dritte. Für eine Aufgabe, die so routiniert ist wie das Wählen eines Zeitplans, sollte die Datenschutzvorgabe der Sensibilität dessen entsprechen, was diese Zeitpläne repräsentieren.
Häufig gestellte Fragen
Wie sieht das Cron-Ausdrucksformat aus?
Ein Standard-Cron-Ausdruck hat 5 durch Leerzeichen getrennte Felder für Minute (0-59), Stunde (0-23), Tag des Monats (1-31), Monat (1-12) und Wochentag (0-6, wobei 0 Sonntag ist). Ein Sternchen (*) bedeutet „jeden" Wert in diesem Feld.
Was bedeutet */5 in Cron?
Die Syntax */5 bedeutet „alle 5". Im Minutenfeld steht */5 für alle 5 Minuten (0, 5, 10, 15…). Im Stundenfeld für alle 5 Stunden. Es funktioniert in jedem Feld.
Sind Cron-Ausdrücke auf allen Plattformen gleich?
Das 5-Feld-Format ist Standard in Linux-Cron, AWS EventBridge, GitHub Actions und den meisten Planungssystemen. Manche Plattformen ergänzen ein 6. Feld für Sekunden oder Jahr. Prüfen Sie die Dokumentation Ihrer Plattform.
Wie plane ich für den letzten Tag jedes Monats?
Standard-Cron hat kein „letzter Tag"-Schlüsselwort. Nutzen Sie einen Workaround wie tägliche Ausführung mit Datumscheck im Skript oder plattformspezifische Erweiterungen (AWS EventBridge unterstützt L für „last").
Why did my cron job not run at the expected time?
The most common cause is timezone confusion. Server cron usually runs in UTC, not your local time. Other causes include the server being asleep at the scheduled minute, the user crontab not being installed, or PATH/environment differences between your shell and cron's stripped-down environment.
What is the difference between 0 in the day-of-week field and 7?
Both 0 and 7 represent Sunday in classic Vixie cron, which uses 0-6 plus an alias for 7. Some implementations (notably AWS EventBridge) use 1-7 with Sunday as 7 and Monday as 1, so always check your platform's documentation before assuming.