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
Ü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.