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.
Einen cron-Ausdruck als systemd-Zeitgeber umschreiben
Einen Zeitplan von `cron` auf einen `systemd`-Zeitgeber zu verlegen bedeutet, die fünf Felder Minute, Stunde, Tag des Monats, Monat und Wochentag in die Schreibweise `OnCalendar=` zu übersetzen. Geben Sie einen cron-Ausdruck ein, und dieses Werkzeug erzeugt das entsprechende `OnCalendar=` samt Warnungen zu allem, was Aufmerksamkeit verdient.
**Das Wichtigste an dieser Übersetzung ist, wie sich Tag des Monats und Wochentag verhalten, wenn beide angegeben sind.** Cron liest die beiden als **Oder**: `0 0 1 * 1` bedeutet „der Erste des Monats **oder** jeder Montag" und kann etwa fünfmal im Monat auslösen. **Systemds `OnCalendar=` hingegen behandelt dieselbe Angabe als Und.** Sie bedeutet dann „der Erste **und** ein Montag" und löst ein- bis zweimal im Jahr aus. **Eine mechanische Übersetzung verändert also, wie oft der Auftrag läuft, und zwar stillschweigend.** Dieses Werkzeug erkennt diese Kombination und warnt Sie davor.
So wandeln Sie um
- Geben Sie den cron-Ausdruck ein Schreiben Sie die fünf Felder — Minute, Stunde, Tag des Monats, Monat, Wochentag — durch Leerzeichen getrennt.
- Sehen Sie das erzeugte OnCalendar= durch Sie erhalten die entsprechende systemd-Schreibweise.
- Lesen Sie die Warnungen **Wo Tag des Monats und Wochentag beide angegeben sind, wird auf die veränderte Bedeutung hingewiesen.**
- Übertragen Sie es in eine Zeitgebereinheit Fügen Sie es in den Abschnitt `[Timer]` einer `.timer`-Datei ein.
Tipps für die Nutzung
- 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.
Wofür Sie es nutzen können
Um in eine Containerumgebung zu wechseln
**Container führen oft keinen cron-Dienst, sodass Zeitpläne auf systemd-Zeitgeber oder eine andere Lösung übergehen müssen.**
Um eine Aufzeichnung des Gelaufenen zu haben
Ein systemd-Zeitgeber hinterlässt seine Spur in journald, der sich später nachgehen lässt.
Um Abhängigkeiten zwischen Aufträgen zu wollen
**Erst nach dem Start einer anderen Einheit zu laufen lässt sich mit cron nicht ausdrücken.**
Um bestehende Zeitpläne zu sichten
Eine Reihe von cron-Ausdrücken gemeinsam umzuwandeln gibt Ihnen Gelegenheit zu prüfen, ob die Abstände die gemeinten sind.
Begriffe zu Zeitplanern
- Cron-Ausdruck
- Die Schreibweise, die eine Zeit durch fünf Felder ausdrückt: Minute, Stunde, Tag des Monats, Monat und Wochentag. **Tag des Monats und Wochentag werden als Oder gelesen.**
- OnCalendar=
- Der Schlüssel, der die Zeit in einem systemd-Zeitgeber angibt. **Tag des Monats und Wochentag werden als Und gelesen.**
- Zeitgebereinheit
- Eine Datei mit der Endung `.timer`, die den gleichnamigen `.service` startet.
- Persistent=
- **Die Einstellung, die einen Zeitgeber nach dem Hochfahren nachholen lässt, falls das System zum Auslösezeitpunkt aus war.** Sie wirkt ähnlich wie `anacron` bei cron.
- AccuracySec=
- Die Toleranz des Auslösezeitpunkts. Voreingestellt gilt eine Minute Spielraum, weshalb man sie angibt, wo es genau sein muss.
- Journald
- Systemds Protokollsammlung. Auch die Ausgabe eines von einem Zeitgeber gestarteten Auftrags wird hier aufbewahrt.
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.