systemd Timer
systemd Timer-Units sind der moderne Ersatz für cron auf systemd-Systemen.
Ein Timer ist eine .timer-Unit, die eine zugehörige .service-Unit aktiviert.
Vorteile gegenüber cron:
- Logging direkt im Journal (
journalctl -u mein-timer) - Abhängigkeiten zu anderen Units möglich
- Verpasste Jobs nachholen (
Persistent=true) - Genaue Kontrolle über Ressourcen (CPU, RAM via cgroups)
- Mit
systemctleinheitlich verwalten
Aufbau: Timer + Service
Abschnitt betitelt „Aufbau: Timer + Service“Jeder Timer braucht eine zugehörige Service-Unit mit gleichem Namen:
/etc/systemd/system/backup.timer ← wann/etc/systemd/system/backup.service ← wasBeispiel: tägliches Backup
Abschnitt betitelt „Beispiel: tägliches Backup“[Unit]Description=Tägliches Backup
[Service]Type=oneshotExecStart=/usr/local/bin/backup.shUser=backup[Unit]Description=Tägliches Backup um 03:00
[Timer]OnCalendar=*-*-* 03:00:00Persistent=true
[Install]WantedBy=timers.targetsudo systemctl daemon-reloadsudo systemctl enable --now backup.timerTimer-Typen
Abschnitt betitelt „Timer-Typen“Kalender-basiert: OnCalendar
Abschnitt betitelt „Kalender-basiert: OnCalendar“OnCalendar verwendet eine flexible Kalender-Syntax:
OnCalendar=daily # täglich um 00:00OnCalendar=weekly # wöchentlich (montags 00:00)OnCalendar=monthly # monatlich am 1.OnCalendar=hourly # jede Stunde
# Eigene Ausdrücke: YYYY-MM-DD HH:MM:SSOnCalendar=*-*-* 03:00:00 # täglich um 03:00OnCalendar=Mon *-*-* 08:00:00 # jeden Montag um 08:00OnCalendar=*-*-1 00:00:00 # jeden 1. des MonatsOnCalendar=Sat,Sun *-*-* 10:00 # Wochenende um 10:00OnCalendar=*:0/15 # alle 15 MinutenAusdrücke validieren:
systemd-analyze calendar "Mon *-*-* 08:00:00"# → nächste Ausführung: Mon 2026-03-25 08:00:00 CETRelativ-basiert: OnBootSec, OnUnitActiveSec
Abschnitt betitelt „Relativ-basiert: OnBootSec, OnUnitActiveSec“[Timer]OnBootSec=5min # 5 Minuten nach dem Booten (einmalig)OnUnitActiveSec=1h # danach jede StundeWeitere relative Trigger:
| Direktive | Bedeutung |
|---|---|
OnBootSec | nach dem Booten |
OnStartupSec | nach dem Start von systemd |
OnActiveSec | nach Aktivierung des Timers |
OnUnitActiveSec | nach letzter Aktivierung der Service-Unit |
OnUnitInactiveSec | nach letzter Deaktivierung der Service-Unit |
Persistent — verpasste Jobs nachholen
Abschnitt betitelt „Persistent — verpasste Jobs nachholen“[Timer]OnCalendar=dailyPersistent=trueMit Persistent=true merkt sich systemd den letzten Ausführungszeitpunkt
(in /var/lib/systemd/timers/). War das System zur geplanten Zeit aus, wird
der Job beim nächsten Start sofort nachgeholt.
Timer verwalten
Abschnitt betitelt „Timer verwalten“systemctl list-timers # alle aktiven Timer + nächste Ausführungsystemctl list-timers --all # auch inaktive Timer
systemctl start backup.timer # Timer aktivierensystemctl stop backup.timer # Timer deaktivierensystemctl enable backup.timer # autostart beim Bootensystemctl disable backup.timer
# Timer sofort auslösen (Service direkt starten)systemctl start backup.service
# Status und letzte Ausführungsystemctl status backup.timersystemctl status backup.servicejournalctl -u backup.service # Logs des Servicejournalctl -u backup.timer # Logs des Timersjournalctl -u backup.service --since todayjournalctl -u backup.service -n 50Transiente Timer (ohne Unit-Datei)
Abschnitt betitelt „Transiente Timer (ohne Unit-Datei)“Für schnelle einmalige Aufgaben — ähnlich wie at:
# In 30 Minuten einen Befehl ausführensystemd-run --on-active=30m /usr/local/bin/mein-skript.sh
# Um 02:00 Uhr heute Nachtsystemd-run --on-calendar="02:00" /usr/local/bin/mein-skript.sh
# Mit Beschreibungsystemd-run --on-active=1h --unit=mein-job /usr/local/bin/mein-skript.shsystemctl list-timers # zeigt auch transiente TimerVergleich: cron vs. systemd Timer
Abschnitt betitelt „Vergleich: cron vs. systemd Timer“| cron | systemd Timer | |
|---|---|---|
| Konfiguration | Crontab-Zeilen | zwei Unit-Dateien |
| Logging | syslog / Mail | Journal |
| Verpasste Jobs | nein (ohne anacron) | Persistent=true |
| Abhängigkeiten | keine | volle Unit-Abhängigkeiten |
| Ressourcen-Limits | keine | cgroups |
| Einmalige Jobs | nein | systemd-run |
| Benutzer-Jobs | ja (crontab -e) | ja (User-Units) |
| Verbreitung | überall | systemd-Systeme |