Cron gegen systemd-Timer
| cron | systemd-Timer | |
|---|---|---|
| Definition | Eine Zeile in einer crontab | Zwei Dateien: .timer (wann) und .service (was) |
| Verpasste Läufe | Verloren (außer mit anacron) | Persistent=true führt sie beim nächsten Start aus |
| Umgebung | Minimaler PATH, kein Profil; Ausgabe per Mail | In der Unit definiert; Ausgabe ins Journal |
| Überlappung | Läuft erneut, auch wenn der letzte Lauf noch läuft | Überlappt nie: ein Timer wartet, bis sein Service fertig ist |
| Abhängigkeiten | Keine | After=network-online.target, Mounts, andere Units |
| Ressourcenlimits, Sandboxing | Nein | Alles von systemd: MemoryMax, CPUQuota, ProtectSystem… |
| Einsicht | crontab -l, im Syslog grep | systemctl list-timers, journalctl -u, systemctl status |
| Einfachheit | Eine Zeile | Zwanzig Zeilen |
Für einen Einzeiler auf einem persönlichen Rechner ist cron in Ordnung. Für alles auf einem Server, das nicht überlappen darf, nach Ausfallzeit nachholen muss, Limits braucht oder dessen Logs später jemand liest, ist ein Timer das bessere Werkzeug, und der Konverter schreibt den Boilerplate.
Was der Konverter mit dem Befehl macht
ExecStart= nimmt einen absoluten Pfad und Argumente, keine Shell-Zeile. Umleitungen (>> log 2>&1) werden entfernt, weil das Journal die Ausgabe erfasst; Pipes und && werden in /bin/sh -c '…' gehüllt. Crons Regel „% bedeutet Zeilenumbruch“ gilt nicht, also funktioniert date +%F wie geschrieben. In der crontab gesetzte Umgebungsvariablen wandern in Environment=-Zeilen.
Tag im Monat und Wochentag
Schränkt eine Cron-Zeile beides ein, feuert cron, wenn eines passt; systemd verlangt beides. Der Konverter warnt, da dieser Zeitplan zwei Timer braucht, um nachgebildet zu werden.
Fragen
Wohin kommen die Dateien?
/etc/systemd/system/ für System-Units, ~/.config/systemd/user/ für User-Units (dann systemctl --user und loginctl enable-linger nutzen). Nach dem Hinzufügen oder Bearbeiten systemctl daemon-reload ausführen.
Wie sehe ich, wann er das nächste Mal läuft?
systemctl list-timers --all zeigt den nächsten und letzten Lauf jedes Timers. systemd-analyze calendar "ausdruck" zeigt den nächsten Lauf für jeden OnCalendar-Ausdruck.
Wie starte ich ihn jetzt, ohne zu warten?
systemctl start name.service (nicht den Timer). Der Timer behält seinen eigenen Zeitplan.
Kann ein Timer alle 10 Sekunden laufen?
Ja, mit OnCalendar=*:*:0/10 und AccuracySec=1s, oder mit OnUnitActiveSec=10s für „10 Sekunden nach dem Ende des letzten Laufs“. Cron kommt nicht unter eine Minute.