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

  1. Geben Sie den cron-Ausdruck ein Schreiben Sie die fünf Felder — Minute, Stunde, Tag des Monats, Monat, Wochentag — durch Leerzeichen getrennt.
  2. Sehen Sie das erzeugte OnCalendar= durch Sie erhalten die entsprechende systemd-Schreibweise.
  3. Lesen Sie die Warnungen **Wo Tag des Monats und Wochentag beide angegeben sind, wird auf die veränderte Bedeutung hingewiesen.**
  4. Ü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

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.
Tool-kun

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