Cron-Ausdruck zu systemd-Timer Konverter

Kostenloses Tool zur Umwandlung eines Cron-Ausdrucks (Minute Stunde Tag Monat Wochentag) in die OnCalendar=-Syntax von systemd-Timern. Warnt vor der ODER-Semantik bei gleichzeitiger Einschränkung von Tag und Wochentag, nützlich bei der Migration von Cron-Jobs zu Docker/Kubernetes-Umgebungen.

Zuordnung von Cron-Feldern zu systemd-Komponenten

Die 5 Felder eines Cron-Ausdrucks entsprechen der OnCalendar=-Syntax von systemd wie folgt.

Position Cron-Feld systemd-Entsprechung
1 Minute Minute im Zeitteil (MM in HH:MM:SS)
2 Stunde Stunde im Zeitteil (HH in HH:MM:SS)
3 Tag des Monats Tag im Datumsteil (Tag in Jahr-Monat-Tag)
4 Monat Monat im Datumsteil (Monat in Jahr-Monat-Tag)
5 Wochentag Wochentag-Präfix (z. B. Mon, Mon..Fri)

Da Cron kein Sekundenfeld hat, ist die Sekundenkomponente in systemd immer "00". Wenn Tag und Monat beide uneingeschränkt (*) sind, kann der Jahr-Monat-Tag-Teil von systemd vollständig weggelassen werden.

Cron-Wochentagsnummer und systemd-Wochentagskürzel

Cron stellt Wochentage mit Zahlen von 0 bis 7 dar, während systemd englische Wochentagskürzel verwendet.

Cron-Wochentagsnummer systemd-Wochentagskürzel
0 (7) Sun
1 Mon
2 Tue
3 Wed
4 Thu
5 Fri
6 Sat

Häufige Umwandlungsbeispiele

Cron-Ausdruck OnCalendar= Bedeutung
* * * * * OnCalendar=*-*-* *:*:00 Läuft jede Minute (entspricht "* * * * *" in Cron).
*/15 * * * * OnCalendar=*:00/15:00 Läuft alle 15 Minuten.
0 9 * * 1-5 OnCalendar=Mon..Fri 09:00:00 Läuft montags bis freitags um 9:00 Uhr.
0 0 1 * * OnCalendar=*-*-01 00:00:00 Läuft am 1. jedes Monats um Mitternacht.
0 0 1 1 * OnCalendar=*-01-01 00:00:00 Läuft jährlich am 1. Januar um Mitternacht.
0 0 1 * 1 OnCalendar=Mon *-*-01 00:00:00 Beispiel mit gleichzeitiger Angabe von Tag des Monats (der 1.) und Wochentag (Montag). In Cron ist dies eine ODER-Bedingung (läuft, wenn eines von beiden zutrifft), in systemd wird daraus jedoch eine UND-Bedingung (läuft nur, wenn beide zutreffen), sodass das umgewandelte Ergebnis seltener läuft als der ursprüngliche Cron-Ausdruck.

Ein Cron-Ausdruck, der sowohl Tag des Monats als auch Wochentag einschränkt (keiner ist "*"), kann nicht genau in die OnCalendar-Syntax von systemd umgewandelt werden, da Cron hier ODER-Semantik verwendet, systemd jedoch immer UND-Semantik. Erwägen Sie, solche Fälle in zwei separate systemd-Timer aufzuteilen.

Tipps

  • Wenn Sie sowohl Tag des Monats als auch Wochentag auf etwas anderes als "*" einschränken, kann die ODER-Bedingung von Cron durch die UND-Bedingung von systemd nicht genau abgebildet werden. Prüfen Sie die Warnung im Ergebnis und erwägen Sie bei Bedarf eine Aufteilung in zwei Timer.
  • Manche minimalen Container-Basisimages (z. B. Alpine-basierte Docker-Images) enthalten überhaupt keinen Cron-Daemon, sodass systemd-Timer beim Migrieren geplanter Aufgaben eine praktische Alternative sind.
  • Sie können die erzeugte OnCalendar-Zeile mit dem Befehl "systemd-analyze calendar" prüfen, der auch die nächsten geplanten Ausführungszeiten anzeigt.
  • Im Gegensatz zu einer einzelnen Crontab-Zeile besteht ein systemd-Timer aus zwei Dateien: einer .timer-Unit (dem Zeitplan) und einer .service-Unit (der eigentlichen auszuführenden Aufgabe).
  • Bei einfachen Zeitplänen, die Tag des Monats und Wochentag nicht kombinieren (stündlich, täglich, wöchentlich usw.), ist diese Umwandlung immer exakt.

Häufig gestellte Fragen

OnCalendar= hat die Form "Wochentag Jahr-Monat-Tag Stunde:Minute:Sekunde" (Wochentag- und Datumsteil sind optional). "*" bedeutet "jeder Wert", ".." kennzeichnet einen Bereich, "/" ein Intervall und "," listet mehrere Werte auf. Zum Beispiel bedeutet "Mon..Fri 09:00:00" genau 9:00 Uhr werktags.

systemd-Timer bieten Funktionen, die Cron allein nicht hat: zentralisierte Ausführungsprotokolle über journalctl, Warten auf den Start abhängiger Dienste und konfigurierbare automatische Wiederholungen bei Fehlern. Zudem verzichten Container-Basisimages zunehmend auf den Cron-Daemon, um leichtgewichtig zu bleiben, sodass Timer auf systemd-basierten Hosts zur natürlichen Alternative werden.

Nach der Semantik von Vixie-Cron läuft die Aufgabe, wenn sowohl Tag des Monats als auch Wochentag eingeschränkt sind (keiner ist "*"), sobald eines von beiden zutrifft – eine ODER-Bedingung. Die OnCalendar-Syntax von systemd behandelt Wochentag- und Datumsteil hingegen immer als UND-Bedingung (beide müssen zutreffen). Dieses Tool erkennt diesen Fall und zeigt einen Hinweis, dass das umgewandelte Ergebnis seltener laufen kann als der ursprüngliche Cron-Ausdruck.

Bei einfachen Zeitplänen, die Tag des Monats und Wochentag nicht kombinieren, ist die Umwandlung exakt. Erscheint jedoch der Hinweis zur ODER-Semantik, kann die tatsächliche Häufigkeit von der beabsichtigten abweichen. Wir empfehlen daher, vor dem Einsatz in der Produktion die nächsten geplanten Ausführungszeiten mit "systemd-analyze calendar" zu prüfen.

Ein standardmäßiger 5-Felder-Cron-Ausdruck hat kein Sekundenfeld, daher ist die Sekundenkomponente der erzeugten OnCalendar-Zeile immer "00". Die OnCalendar-Syntax von systemd selbst unterstützt zwar die Angabe von Sekunden, dieses Tool nutzt dies jedoch bei der Umwandlung aus Cron nicht.
ツールくん

Übrigens – Von Cron zu systemd-Timern

systemd entstand um 2010 als Init-System zur Verwaltung des Linux-Bootvorgangs und ist seitdem in den meisten Distributionen zum Standard geworden. Die darin enthaltene Timer-Funktion bietet ähnlich wie Cron eine periodische Ausführung, ergänzt jedoch um Fähigkeiten, die Cron nie hatte: Abhängigkeitsauflösung, zentralisierte Ausführungsprotokolle über journalctl und konfigurierbares Wiederholungsverhalten bei Fehlern.

Gleichzeitig verzichten Container-Umgebungen wie Docker und Kubernetes zunehmend in ihren Basisimages ganz auf einen Cron-Daemon, um die Imagegröße gering zu halten. Muss eine periodische Aufgabe in solchen Umgebungen laufen, sind die praktischen Optionen entweder ein Mechanismus auf Orchestrator-Ebene wie ein Kubernetes-CronJob oder – sofern der Host selbst systemd nutzt – die Übergabe an systemd-Timer.

Die OnCalendar=-Syntax ist ausdrucksstärker als die 5 Felder von Cron und unterstützt Jahresgenauigkeit sowie Sekundengenauigkeit. Gerade wegen dieser höheren Ausdruckskraft ändern manche Cron-Ausdrücke (solche, die Tag des Monats und Wochentag gleichzeitig als ODER-Bedingung einschränken) bei einer naiven Umwandlung ihre Bedeutung. Dieses Tool zeigt diesen Hinweis ausdrücklich an, damit Migrationen nicht über eine leicht zu übersehende Falle stolpern.