Zum Inhalt springen

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 systemctl einheitlich verwalten

Jeder Timer braucht eine zugehörige Service-Unit mit gleichem Namen:

/etc/systemd/system/backup.timer ← wann
/etc/systemd/system/backup.service ← was
/etc/systemd/system/backup.service
[Unit]
Description=Tägliches Backup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
User=backup
/etc/systemd/system/backup.timer
[Unit]
Description=Tägliches Backup um 03:00
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
Terminal-Fenster
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer

OnCalendar verwendet eine flexible Kalender-Syntax:

OnCalendar=daily # täglich um 00:00
OnCalendar=weekly # wöchentlich (montags 00:00)
OnCalendar=monthly # monatlich am 1.
OnCalendar=hourly # jede Stunde
# Eigene Ausdrücke: YYYY-MM-DD HH:MM:SS
OnCalendar=*-*-* 03:00:00 # täglich um 03:00
OnCalendar=Mon *-*-* 08:00:00 # jeden Montag um 08:00
OnCalendar=*-*-1 00:00:00 # jeden 1. des Monats
OnCalendar=Sat,Sun *-*-* 10:00 # Wochenende um 10:00
OnCalendar=*:0/15 # alle 15 Minuten

Ausdrücke validieren:

Terminal-Fenster
systemd-analyze calendar "Mon *-*-* 08:00:00"
# → nächste Ausführung: Mon 2026-03-25 08:00:00 CET
[Timer]
OnBootSec=5min # 5 Minuten nach dem Booten (einmalig)
OnUnitActiveSec=1h # danach jede Stunde

Weitere relative Trigger:

DirektiveBedeutung
OnBootSecnach dem Booten
OnStartupSecnach dem Start von systemd
OnActiveSecnach Aktivierung des Timers
OnUnitActiveSecnach letzter Aktivierung der Service-Unit
OnUnitInactiveSecnach letzter Deaktivierung der Service-Unit
[Timer]
OnCalendar=daily
Persistent=true

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

Terminal-Fenster
systemctl list-timers # alle aktiven Timer + nächste Ausführung
systemctl list-timers --all # auch inaktive Timer
systemctl start backup.timer # Timer aktivieren
systemctl stop backup.timer # Timer deaktivieren
systemctl enable backup.timer # autostart beim Booten
systemctl disable backup.timer
# Timer sofort auslösen (Service direkt starten)
systemctl start backup.service
# Status und letzte Ausführung
systemctl status backup.timer
systemctl status backup.service
Terminal-Fenster
journalctl -u backup.service # Logs des Service
journalctl -u backup.timer # Logs des Timers
journalctl -u backup.service --since today
journalctl -u backup.service -n 50

Für schnelle einmalige Aufgaben — ähnlich wie at:

Terminal-Fenster
# In 30 Minuten einen Befehl ausführen
systemd-run --on-active=30m /usr/local/bin/mein-skript.sh
# Um 02:00 Uhr heute Nacht
systemd-run --on-calendar="02:00" /usr/local/bin/mein-skript.sh
# Mit Beschreibung
systemd-run --on-active=1h --unit=mein-job /usr/local/bin/mein-skript.sh
Terminal-Fenster
systemctl list-timers # zeigt auch transiente Timer
cronsystemd Timer
KonfigurationCrontab-Zeilenzwei Unit-Dateien
Loggingsyslog / MailJournal
Verpasste Jobsnein (ohne anacron)Persistent=true
Abhängigkeitenkeinevolle Unit-Abhängigkeiten
Ressourcen-Limitskeinecgroups
Einmalige Jobsneinsystemd-run
Benutzer-Jobsja (crontab -e)ja (User-Units)
Verbreitungüberallsystemd-Systeme