03 / GUIDES
Cron-Ausdrücke schreiben, die keine Überraschungen auslösen
Die fünf Felder und ihre Bereiche, Namen versus Zahlen, die ODER-Falle aus Tag des Monats und Wochentag, Sonntag als 0 oder 7, Sommerzeit-Lücken und -Überlappungen und das Validieren mit einer Vorschau der nächsten Läufe vor dem Deploy.
Fünf Felder, von links nach rechts gelesen
Ein klassischer Cron-Ausdruck besteht aus fünf leerzeichengetrennten Feldern: Minute (0–59), Stunde (0–23), Tag des Monats (1–31), Monat (1–12) und Wochentag (0–7). Jedes Feld akzeptiert einen Einzelwert, eine kommagetrennte Liste, einen Bereich mit Bindestrich, einen Schritt nach einem Schrägstrich oder einen Asterisk für jeden Wert.
Die meisten Cron-Bugs sind keine exotische Syntax, sondern ein achtlos gelesenes Alltagsfeld: ein Schritt, der an der Bereichsgrenze zurücksetzt, oder ein Stundenfeld, das für eine Zwölf-Stunden-Uhr geschrieben wurde, in einem System, das bis dreiundzwanzig zählt.
- ListenListen wählen diskrete Werte: 0,30 im Minutenfeld feuert zur vollen Stunde und zur halben.
- Bereiche und SchritteBereiche wählen eine Spanne: 9-17 im Stundenfeld deckt die Geschäftszeiten ab, und ein Schritt lichtet sie aus – 9-17/2 feuert jede zweite Stunde innerhalb der Spanne.
- Der Asterisk matcht allesDer Asterisk heißt nicht „dieses Feld ignorieren“; er matcht aktiv jeden Wert – was wichtig wird, sobald zwei Tagesfelder zusammenwirken.
Namen sind Zahlen mit besserer Dokumentation
Monats- und Wochentag-Felder akzeptieren dreibuchstabige englische Namen – JAN bis DEC und SUN bis SAT – als Aliase für ihre Zahlen. 0 9 * JAN MON und 0 9 * 1 1 beschreiben denselben Zeitplan, aber die Namensversion erklärt sich dem nächsten Leser selbst und widersteht Off-by-one-Änderungen.
- Groß-/Kleinschreibung egalNamen parsen ohne Beachtung der Groß-/Kleinschreibung – mon, Mon und MON funktionieren alle –, aber Großbuchstaben sind die Konvention, die als Absicht wirkt.
- Namen in BereichenNamen funktionieren auch in Bereichen und Listen: MON-FRI ist die Standard-Wochentags-Spanne, und JAN,APR,JUL,OCT wählt die Quartalsmonate.
- Die Erklärung lesenCron Builder & Explainer normalisiert den Ausdruck und erklärt jedes Feld einzeln – „Monat: jeder Wert“, „Wochentag: 1, 2, 3, 4, 5“ –, sodass du bestätigen kannst, dass der Parser die Namen so gelesen hat, wie du sie gemeint hast.
Wie die beiden Tagesfelder zusammenwirken
Dieses Tool folgt Tagesregeln nach Vixie-Art: Beginnt keines der beiden Tagesfelder mit *, genügt eine Übereinstimmung in einem der Felder. 0 9 13 * FRI bedeutet nicht „Freitag, der 13.“, sondern den 13. jedes Monats und jeden Freitag.
Die Ausgabe des Explainers ist dazu explizit: Sie meldet die Semantik als dom-dow-or neben den berechneten Läufen, sodass ein Ausdruck, der weit öfter feuern wird als beabsichtigt, seine Karten zeigt, bevor er eine Crontab erreicht.
- Auch Wildcard-Schritte schränken einBeginnt ein Tagesfeld mit *, auch bei einem Schritt wie */2, verlangt dieses Tool eine Übereinstimmung beider Tagesfelder; die Schritteinschränkung bleibt bestehen.
- Ohne führende Wildcard gilt ODERBeginnt keines der Tagesfelder mit *, verwendet dieses Tool ODER: Es kann der Monatstag oder der Wochentag übereinstimmen.
- UND braucht einen UmwegFür einen echten Freitag-den-13. lass cron den 13. wählen und lass das Kommando selbst den Wochentag prüfen – oder nutze einen Scheduler mit UND-Semantik, die klassisches cron nicht hat.
Sonntag ist 0 – und meist auch 7
Das Wochentag-Feld nummeriert Sonntag als 0, Montag als 1 und so weiter bis Samstag als 6. Die meisten Implementierungen akzeptieren auch 7 als zweiten Sonntag für Menschen, die ab Montag zählen – der Toolars-Parser normalisiert 7 intern auf 0 –, aber manche Systeme akzeptieren nur einen der beiden, und ISO-artige Nummerierung mit Montag bei 1 existiert anderswo.
- 0 und 70 und 7 sind beide Sonntag, wo 7 akzeptiert wird; 0 zu schreiben ist die portable Wahl über Scheduler hinweg.
- Stilles Off-by-oneEin Wochentag 7 auf einem System, das ihn ablehnt, scheitert laut beim Deploy, aber ein Wochentag, der als „siebter Tag ab Montag“ missverstanden wird, scheitert still am falschen Tag.
- Pro Plattform neu bestätigenWenn ein Ausdruck zwischen Implementierungen wandert – System-Crontab, Container-Plattform, CI-Scheduler –, bestätige die Wochentags-Nummerierung neu, statt anzunehmen, sie habe die Reise überlebt.
Die Sommerzeit verbiegt den Zeitplan
Zeitumstellungen erzeugen fehlende und doppelte lokale Minuten. Diese Vorschau überspringt eine nicht vorhandene Uhrzeit wie 02:30 beim Vorstellen der Uhr und zeigt eine wiederholte passende Minute beim Zurückstellen zweimal. Ein produktiver Scheduler kann verpasste Läufe nachholen oder einen doppelten Lauf unterdrücken; prüfe seine Regeln.
- Die fehlende StundeLücke beim Vorstellen: Die Vorschau findet keine passende Minute um 02:30; manche Scheduler holen verpasste Aufgaben nach der Umstellung nach.
- Die doppelte StundeÜberlappung beim Zurückstellen: Die Vorschau kann beide passenden Zeitpunkte anzeigen, während ein echter Scheduler den zweiten Lauf möglicherweise unterdrückt.
- UTC hat keine SommerzeitDer saubere Ausweg ist UTC: Es hat keine Sommerzeit-Umstellungen, 30 2 * * * bedeutet also an jedem Tag des Jahres denselben Zeitpunkt. Der Explainer bietet UTC, die lokale Zone des Geräts und benannte Zonen wie America/New_York und Europe/London.
Mit den nächsten Läufen validieren, nicht mit Hoffnung
Der Unterschied zwischen einem korrekten Ausdruck und einem plausibel aussehenden ist eine Liste konkreter Ausführungszeiten. Cron Builder & Explainer berechnet die nächsten zehn Läufe ab jetzt in der von dir gewählten Zeitzone, sucht bis zu 366 Tage voraus und wertet in einem Hintergrund-Worker aus, damit ein schwerer Ausdruck den Tab nicht lahmlegt.
- Die Läufe lesenLies die ersten Läufe gegen die Absicht: „Werktags um 09:00“ sollte Montag bis Freitag um neun zeigen, und ein Samstag in der Liste ist die ODER-Falle, die sich zu erkennen gibt.
- Eine Umstellung kreuzenWähle eine benannte Zeitzone und prüfe die kommenden Läufe, wenn die nächste Zeitumstellung in die 366-Tage-Vorschau fällt. Der Arbeitsbereich beginnt bei „jetzt“; ein eigener Starttermin lässt sich nicht festlegen.
- Explizite FehlerUngültige Ausdrücke melden Fehler. Keine Treffer innerhalb von 366 Tagen ergeben einen Suchlimit-Fehler; ein bis neun Treffer werden als Teilergebnis statt als leere Liste zurückgegeben.
Zeitpläne und Muster teilen eine Disziplin.
Beide sind winzige Strings mit überdimensionalem Explosionsradius – lerne die Schreiben-Testen-Refaktorisieren-Schleife für reguläre Ausdrücke, ausgeführt in einem lokalen Worker mit Timeout.