Cron-Ausdruck-Generator
Cron-Job-Zeitpläne visuell erstellen und verstehen.
Schnell-Presets
Nächste 5 Ausführungen
Cron-Syntax-Referenz
* · jeder Wert
*/5 · alle 5 Einheiten
1,15 · bei den Werten 1 und 15
1-5 · Bereich von 1 bis 5
Felder: Minute (0–59), Stunde (0–23), Tag des Monats (1–31), Monat (1–12), Wochentag (0–6, 0=Sonntag)
Eine kurze Geschichte des Cron-Ausdrucks
Der fünffeldrige Cron-Ausdruck stammt aus dem Mai 1975, als eine frühe Version aus den AT&T Bell Laboratories als Teil von Research Unix Version 7 ausgeliefert wurde. Der Name verweist auf Chronos, die griechische Personifikation der Zeit. Das Format war einfach: fünf durch Leerzeichen getrennte Felder (Minute, Stunde, Tag-im-Monat, Monat, Wochentag) auf einer Zeile in /usr/lib/crontab. Die Vixie-cron-Neufassung von Paul Vixie im Jahr 1987 wurde zur faktischen modernen Implementierung; jede große Linux-Distribution liefert ein Vixie-abgeleitetes cron aus, und Vixie fügte das benutzerspezifische crontab, die Unterstützung für Umgebungsvariablen (MAILTO=, CRON_TZ=) und die Kurzform-Makros @hourly / @daily / @reboot hinzu, die heute alle verwenden. Die Cron-Ausdruckssyntax verzweigte sich dann in zwei Pfade. Der Quartz Scheduler (Java, James House, 1998; an Apache und Terracotta gespendet) fügte ein führendes Sekundenfeld, ein optionales nachfolgendes Jahresfeld und die Operatoren L (last) / W (weekday) / # (n-tes Vorkommen) hinzu und produzierte das sechsfeldrige Cron, das AWS EventBridge (ursprünglich CloudWatch Events, 2014) und Springs @Scheduled-Annotation später übernahmen. Das von Azure Functions (2016) verwendete NCronTab-Format setzte Sekunden an erste Stelle, behielt aber fünf Verhaltensfelder bei. Die Cloud-Ära standardisierte dann das fünffeldrige Vixie-Format als Lingua franca: Kubernetes CronJobs (Alpha 1.4 in 2016, GA in 1.21 in 2021) akzeptieren genau fünf Felder, ebenso GitHub Actions (on.schedule.cron, 2019), GCP Cloud Scheduler (2018) und Vercel Cron Jobs (2022). Visuelle Cron-Builder, die Kategorie, zu der dieses Tool gehört, entstanden etwa 2010-2015: crontab.guru (Christine Dodrill, 2014) wurde die meistzitierte Referenz, und die cron-descriptor-Bibliothek (Brady Holt, ursprünglich .NET, portiert nach Java/Python/JS) trieb die meisten «cron in einfachem Englisch»-Übersetzungsebenen an, auf denen Decoder und Generatoren basieren. Ein halbes Jahrhundert nach Bell Labs planen dieselben fünf Felder immer noch die nächtlichen Backups der Welt.
Die Anatomie eines Cron-Ausdrucks
- Fünf Felder, durch Leerzeichen getrennt. In der Reihenfolge:
Minute (0-59) Stunde (0-23) Tag-im-Monat (1-31) Monat (1-12) Wochentag (0-6). Der Ausdruck0 9 * * 1bedeutet «Minute 0, Stunde 9, beliebiger Tag-im-Monat, beliebiger Monat, Wochentag 1 (Montag)», d. h. 9:00 Uhr jeden Montag. Der Monat ist 1-indiziert;0 0 1 0 *ist ungültig, weil es keinen Monat 0 gibt. - Die vier Operatoren.
*stimmt mit jedem Wert im Bereich des Feldes überein.,listet diskrete Werte:0,15,30,45im Minutenfeld.-definiert einen Bereich:9-17im Stundenfeld deckt 9 bis 17 Uhr ab./setzt einen Schritt:*/15in Minuten feuert bei 0, 15, 30, 45. Diese vier Operatoren kombinieren sich frei:*/15 8-18 * * 1-5bedeutet «alle 15 Minuten zwischen 8 und 18 Uhr, nur Wochentage». - Kurzform-Makros. Vixie cron und die meisten modernen Parser akzeptieren
@yearly(oder@annually, äquivalent zu0 0 1 1 *),@monthly(0 0 1 * *),@weekly(0 0 * * 0),@daily(oder@midnight,0 0 * * *),@hourly(0 * * * *) und das spezielle@reboot(läuft einmal, wenn der Cron-Daemon startet). Cloud-Plattformen variieren: GitHub Actions und Vercel lehnen die Makros ab. - Der Schritt-Stolperstein.
*/Nin einem Feld mit Bereich a-b feuert bei a, a+N, a+2N, ..., nicht unbedingt alle N Einheiten der Wanduhrzeit.*/7im Minutenfeld feuert bei 0, 7, 14, 21, 28, 35, 42, 49, 56, springt dann zurück auf 0 zu Beginn der nächsten Stunde und produziert eine 4-Minuten-Lücke. Echte Alle-7-Minuten-Planung ist im Standard-Cron ohne Wrapper unmöglich. - Die ODER-Falle (Tag-im-Monat vs. Wochentag). Wenn beide Felder eingeschränkt sind, feuert Standard-Unix-Cron, wenn eines von beiden übereinstimmt, nicht beide.
0 0 1 * 1bedeutet nicht «Montage, die auf den 1. fallen», es bedeutet «jeder 1. des Monats, plus jeder Montag». Diecrontab(5)-Manpage ist eindeutig. Quartz, AWS EventBridge und systemd-Timer drücken alle «erster Montag» sauber aus; Vixie cron benötigt einen Wrapper. - Die Wochentagsnummerierung variiert. Linux/Vixie, GitHub Actions, GCP Cloud Scheduler, Kubernetes, Azure NCronTab und Spring 5.3+ verwenden alle Sonntag = 0 (Vixie akzeptiert auch 7). Quartz und AWS EventBridge verwenden Sonntag = 1.
0 0 * * 1bedeutet daher «jeden Montag» auf Linux, aber «jeden Sonntag» unter Quartz. Verwenden Sie Drei-Buchstaben-Namen (MON,TUE), wenn Portabilität wichtig ist.
Wo der Ausdruck eingebaut wird
- Linux- / macOS-cron. In
crontab -eeinfügen, gefolgt vom Befehl. Namen (MON,JAN) und Kurzform-Makros (@hourly,@daily,@reboot) werden akzeptiert. Setzen SieCRON_TZ=America/New_Yorkam Anfang des crontab, wenn der Server in UTC ist, Sie aber lokal planen wollen. - Kubernetes CronJob. Setzen Sie
spec.scheduleauf Ihren fünfteldrigen Ausdruck.spec.timeZone(GA in 1.27, März 2023) nimmt eine IANA-Zone wie «Europe/Paris». Das Einbetten vonTZ=in den Schedule-String wird ab 1.29 abgelehnt. Verwenden Siespec.startingDeadlineSeconds, um das Nachhol-Verhalten nach einem Ausfall zu steuern. - GitHub Actions. In
on.schedule.croneinfügen. Schedules laufen in UTC, die kürzeste Kadenz ist 5 Minuten (alles Feinere wird stillschweigend gerundet), und geplante Workflows in öffentlichen Repos werden nach 60 Tagen Repository-Inaktivität automatisch deaktiviert. Cron-Strings innerhalb von YAML müssen in Anführungszeichen gesetzt werden, um Parser-Verwirrung mit dem führenden*zu vermeiden. - AWS EventBridge / EventBridge Scheduler. Verwendet sechs Felder:
cron(min hr dom mon dow yr). Erfordert?entweder in Tag-im-Monat oder Wochentag (nicht beide literal). Quartz-artige OperatorenL(last),W(Werktag) und#(n-tes Vorkommen) funktionieren alle hier. Das Scheduler-Produkt (2022) fügte einen separatenat()-Ausdruck für einmalige Timer hinzu. - GCP Cloud Scheduler. Fünffeldrige Syntax, passend zu Linux. Die
timeZone-Eigenschaft nimmt eine IANA-Zone. Kombinieren Sie mit Cloud Pub/Sub oder HTTP-Zielen.retryConfigbehandelt transiente Fehler; der Default ist kein Retry, was Ingenieure überrascht, die At-least-once-Semantik erwarten. - Vercel Cron Jobs. Fünffeldrige Syntax in
vercel.json. Beide Tag-Felder können nicht gleichzeitig gesetzt werden. Hobby-Pläne begrenzen die Kadenz auf täglich; Pro-Pläne erlauben stündlich. Löst einen HTTP-GET an Ihren Funktionspfad aus, was bedeutet, dass die Funktion idempotent sein muss, falls der Trigger jemals wiederholt.
Standards, Dialekte und Meilensteine
- AT&T Bell Labs cron (Mai 1975). Das Original. Fünf Felder, kein benutzerspezifisches crontab, lief aus
/usr/lib/crontab. Teil von Research Unix Version 7. Die durch Leerzeichen getrennte Grammatik, die alle modernen Varianten erweitern. - Vixie cron (Paul Vixie, 1987). Die Neufassung, die jeder ausführt. Fügte benutzerspezifische crontabs, die Makros
@hourly/@daily/@reboot, Name-Aliase (MON,JAN) und die UmgebungsvariablenMAILTO/CRON_TZhinzu. Die meisten Linux-Distributionen liefern Vixie cron, dcron oder cronie (ein Red-Hat-Fork von Vixie). - Quartz Scheduler (James House, 1998). Java-Bibliothek, die das sechsfeldrige cron (mit führenden Sekunden) und die Operatoren
L/W/#einführte. An Apache und später Terracotta gespendet. Springs@Scheduled-Annotation bettet Quartz-Semantik ein; Spring 5.3+ wechselte kontrovers den Wochentag von Quartz' «Sonntag=1» zu Linux' «Sonntag=0», so dass derselbe String nun unter verschiedenen Versionen verschiedene Tage bedeutet. - systemd-Timer (Lennart Poettering, 2010). Ersetzt cron auf den meisten modernen Linux-Distributionen. Verwendet eine andere Grammatik (
OnCalendar=Mon..Fri 09:00), unterstützt sowohl Kalender- als auch monotone Schedules, loggt injournald, kann Service-Abhängigkeiten deklarieren, validiert mitsystemd-analyze calendarund kombiniert cron-artige Präzision mit anacron-artigem Nachholen viaPersistent=true. - NCronTab (Azure Functions, 2016). Sechs Felder mit Sekunden zuerst:
{second} {minute} {hour} {day} {month} {day-of-week}. Kein Jahresfeld. Die Standardzeitzone ist UTC; überschreiben Sie mit der App-EinstellungWEBSITE_TIME_ZONEauf Linux-App-Service-Plänen. - AWS EventBridge cron-Syntax. Sechs Felder mit Jahr zuletzt:
cron(min hr dom mon dow yr). Erfordert wörtlich?als Platzhalter in dem von dom/dow, das nicht verwendet wird. Unterstützt QuartzL,W,#. Ursprünglich CloudWatch Events (2014), umbenannt in EventBridge im Jahr 2019. - Das 5-vs-6-Felder-Portabilitätsproblem. Das Einfügen eines fünffeldrigen Linux-Ausdrucks in Quartz oder Spring erzeugt «cron expression must consist of 6 fields»-Fehler; das Einfügen eines sechsfeldrigen Ausdrucks in Linux-cron erzeugt «bad day-of-week», weil Linux die Sekundenspalte als Minute liest. Der umgekehrte Fehler ist gefährlicher, weil er stillschweigend parsen und auf dem falschen Schedule laufen kann.
- Jenkins
H-(Hash)-Erweiterung. Jenkins erweitert das Standard-cron mitH, das einen stabilen, aber randomisierten Wert pro Job auswählt, anstatt jeden Job zum selben Augenblick auszuführen.H * * * *bedeutet «jede Stunde, aber zu einer anderen Minute für jeden Job» und verhindert das «Donner-Herde»-Problem, wenn viele Jobs zu Minute 0 geplant sind.
Weitere häufig gestellte Fragen
Sind fünf Felder dasselbe wie sechs oder sieben?
Nein. Die klassische POSIX-Form ist fünf Felder (Minute, Stunde, Tag-im-Monat, Monat, Wochentag). Quartz und Spring verwenden sechs Felder durch Hinzufügen einer führenden Sekundenspalte, und Quartz akzeptiert ein optionales siebtes Jahresfeld. AWS EventBridge verwendet immer sechs Felder, die mit Jahr enden (cron(min hr dom mon dow yr)). Das Einfügen eines fünffeldrigen Ausdrucks in Quartz oder Spring wirft einen Syntaxfehler; das Einfügen eines sechsfeldrigen Ausdrucks in Linux interpretiert die Felder stillschweigend falsch.
Was ist das kleinste Intervall, das cron ausdrücken kann?
Jede Minute (* * * * *) auf Standard-Unix-cron. Es gibt kein eingebautes Sekundenfeld. Scheduler wie Quartz oder NCronTab fügen eines hinzu, wenn Sie eine Unter-Minuten-Kadenz benötigen, und systemd-Timer können OnUnitActiveSec=30s verwenden. GitHub Actions begrenzt die kürzeste Kadenz auf 5 Minuten, und EventBridge feuert innerhalb eines 60-Sekunden-Fensters der geplanten Zeit, also verlassen Sie sich nicht auf cron für harte Echtzeit-Präzision.
Wie führe ich einen Job am letzten Tag des Monats aus?
Standard-fünffeldriges cron hat keinen nativen «letzter Tag des Monats»-Operator. Quartz und AWS EventBridge unterstützen L im Tag-im-Monat-Feld: 0 0 L * ? feuert um Mitternacht am letzten Tag. Auf reinem Linux-cron ist die übliche Umgehung, täglich an Kandidatentagen zu planen und den Befehl zu filtern: 0 0 28-31 * * [ "$(date +\%d -d tomorrow)" = "01" ] && /path/to/script. systemd-Timer drücken es direkt aus mit OnCalendar=*-*-* 00:00:00.
Warum lief mein cron-Job nicht, als ich es erwartete?
Die üblichen Verdächtigen, in der Reihenfolge: (1) der Server ist in einer anderen Zeitzone, als Sie annehmen (überprüfen Sie mit date); (2) PATH ist nicht das, was Ihre interaktive Shell hat, also funktioniert ein Befehl am Prompt, scheitert aber unter cron (verwenden Sie absolute Pfade); (3) die Ausgabe ging per E-Mail und Sie haben sie verpasst (setzen Sie MAILTO="" oder leiten Sie an eine Logdatei um); (4) der cron-Daemon läuft nicht (systemctl status cron); (5) die ODER-Falle (siehe oben) feuert an zusätzlichen Tagen, die Sie nicht beabsichtigten.
Was ist der Unterschied zwischen cron, anacron und systemd-Timern?
Cron erwartet, dass das System zum geplanten Zeitpunkt läuft, und überspringt stillschweigend Jobs, die während Ausfallzeiten anfallen: gut für immer eingeschaltete Server, schlecht für Laptops. Anacron verfolgt pro Job die letzte Ausführungszeitstempel und holt verpasste Jobs nach einem Neustart nach, auf Kosten der Tages- statt Minutengenauigkeit. systemd-Timer ersetzen cron auf den meisten modernen Linux-Distributionen: Sie unterstützen sowohl Kalender- als auch monotone Schedules, loggen in journald, können Service-Abhängigkeiten deklarieren und verwenden Persistent=true, um cron-artige Präzision mit anacron-artigem Nachholen zu kombinieren.
Wie wirken sich Zeitzonen und Sommerzeit auf cron aus?
Die meisten cron-Daemons interpretieren Schedules in der System-Zeitzone. Auf Cloud-Servern bedeutet das üblicherweise UTC, also feuert 0 9 * * * um 9 Uhr UTC, nicht 9 Uhr lokal. Setzen Sie CRON_TZ=America/New_York in einem Linux-crontab; Kubernetes verwendet spec.timeZone; AWS, GCP und Vercel nehmen jeweils eine explizite IANA-Zone. Während der Frühlingszeitumstellung werden Jobs, die in der übersprungenen Stunde geplant sind, von Vixie cron unmittelbar danach ausgeführt, aber von AWS EventBridge vollständig übersprungen. Das sicherste Muster ist, cron in UTC zu belassen und innerhalb des Jobs zu konvertieren.