Die Migration von Cron-Jobs zu systemd-Timern verbessert Protokollierung, Kontrolle und das Nachholen verpasster Läufe, doch die manuelle Umsetzung der Syntax ist fehleranfällig. Dieses Werkzeug validiert Ihren Cron-Ausdruck, erklärt ihn in einfachen Worten, berechnet die nächsten fünf Ausführungen und erzeugt die Dateien .service und .timer zum direkten Kopieren.
Es funktioniert auch in die Gegenrichtung: Fügen Sie einen OnCalendar-Ausdruck ein und erhalten Sie, wo möglich, den passenden Cron-Ausdruck.
Warum von Cron auf systemd-Timer umsteigen
Cron plant seit Jahrzehnten Aufgaben unter Linux, doch systemd bietet klare betriebliche Vorteile: Jede Ausführung wird mit ihrem Exit-Code im Journal protokolliert, Units können Abhängigkeiten und Ressourcenlimits deklarieren, der Status lässt sich mit systemctl list-timers abfragen, und mit Persistent=true werden verpasste Läufe nachgeholt, wenn das System ausgeschaltet war. Dieses Werkzeug wandelt in beide Richtungen zwischen einem Cron-Ausdruck und den entsprechenden Dateien .service und .timer um.
Aufbau eines Cron-Ausdrucks
Eine Crontab-Zeile besteht aus fünf Feldern, die von links nach rechts gelesen werden:
Minute(0-59),Stunde(0-23),Tag des Monats(1-31),Monat(1-12 oder Namen) undWochentag(0-7 oder Namen, wobei 0 und 7 Sonntag sind).- Operatoren:
*(alle),,(Liste),-(Bereich) und/(Schrittweite).*/15bei den Minuten entspricht beispielsweise 0, 15, 30 und 45. - Makros:
@hourly,@daily,@weekly,@monthlyund@yearly.
Es gibt eine wenig bekannte Regel: Sind sowohl der Tag des Monats als auch der Wochentag eingeschränkt, führt Cron die Aufgabe aus, wenn eines von beiden zutrifft (ODER-Verknüpfung). systemd verlangt dagegen, dass beide zutreffen. Deshalb erzeugt das Werkzeug in diesem Fall zwei OnCalendar-Zeilen.
Aufbau von OnCalendar
Das systemd-Format lautet Wochentag JJJJ-MM-TT HH:MM:SS, wobei jede Komponente *, Listen mit Komma, Bereiche mit .. und Wiederholungen mit / zulässt. Die Sekunden werden mit :00 ergänzt, um die Minutengranularität von Cron nachzubilden.
30 2 * * *wird zu*-*-* 02:30:00.*/15 * * * *wird zu*-*-* *:00/15:00.0 9 * * 1-5wird zuMon..Fri *-*-* 09:00:00.0 4 1 * *wird zu*-*-1 04:00:00.
Die zwei Dateien: Service und Timer
Die .service-Datei beschreibt, was ausgeführt wird. Sie wird als Type=oneshot deklariert, weil die Aufgabe startet, endet und sich beendet. Sie unterstützt User=, WorkingDirectory= und ExecStart= mit dem absoluten Pfad der ausführbaren Datei. Die .timer-Datei beschreibt, wann ausgeführt wird:
OnCalendar=: der Kalenderausdruck, der dem Cron-Ausdruck entspricht.Persistent=true: speichert den Zeitpunkt der letzten Aktivierung auf der Festplatte und holt verpasste Läufe beim Systemstart nach.AccuracySec=: Toleranzfenster, um Aktivierungen zusammenzufassen und Energie zu sparen. Der Standardwert beträgt 1 Minute; mit1serfolgt die Ausführung nahezu exakt.Unit=und der Abschnitt[Install]mitWantedBy=timers.target, damit der Timer beim Systemstart aktiviert wird.
Unterschiede in der Umgebung, die zu Fehlern führen
- Minimaler PATH: systemd übernimmt nicht die Umgebung Ihrer Shell. Verwenden Sie in
ExecStartabsolute Pfade. - Standardmäßig keine Shell: Pipes, Umleitungen und Variablen erfordern
/bin/sh -c '...', was das Werkzeug automatisch ergänzt. - Sonderzeichen: In einer Unit-Datei haben
%und$eine eigene Bedeutung und werden als%%und$$maskiert. In der Crontab entspricht ein nicht maskiertes%einem Zeilenumbruch. - Keine E-Mail: Cron sendet die Ausgabe per E-Mail (MAILTO); systemd legt sie im Journal ab, das Sie mit
journalctl -u name.serviceabfragen.
Empfohlene Prüfung
Bevor Sie den Timer aktivieren, validieren Sie den Kalender mit systemd-analyze calendar "*-*-* 02:30:00", das die normalisierte Form und die nächste Ausführung anzeigt, und prüfen Sie die Syntax der Units mit systemd-analyze verify. Nach der Aktivierung bestätigt systemctl list-timers, wann die nächste Ausführung ansteht.
Praxisbeispiele
- Nächtliche Backups mit
Persistent=true, damit sie nicht verloren gehen, wenn der Server ausgeschaltet war. - Log-Rotation und Bereinigung mit niedrig priorisierten Läufen und großzügigem
AccuracySec. - Zertifikatserneuerung und Synchronisation mit auditierbarer Protokollierung im Journal.
- Migrationsprüfungen: eine geerbte Crontab gesammelt umwandeln und prüfen, welche Aufgaben von Umgebungsvariablen abhängen.
Zeitzone
Cron und systemd führen Aufgaben nach der Zeitzone des Servers aus, sofern keine andere angegeben ist. Das Werkzeug zeigt die nächsten fünf Ausführungen in der lokalen Zeit Ihres Browsers oder in UTC an, damit Sie prüfen können, ob der Kalender Ihren Erwartungen entspricht.