Linux Systemd Timer
Systemd Timer: Moderne Task-Planung
Systemd Timer sind die moderne Alternative zu Cron. Lernen Sie, wie Sie zeitgesteuerte Aufgaben mit Systemd einrichten.
Timer vs. Cron
| Feature | Cron | Systemd Timer |
|---|---|---|
| Logging | Manuell | Journal integriert |
| Dependencies | Nicht möglich | Ja (After=, Requires=) |
| Verpasste Runs | Übersprungen | Nachholbar (Persistent=) |
| Randomisierung | Nein | Ja (RandomizedDelaySec=) |
| Resource Limits | Nein | Ja (cgroups) |
Timer erstellen
# 1. Service erstellen # /etc/systemd/system/backup.service [Unit] Description=Daily Backup After=network.target [Service] Type=oneshot ExecStart=/usr/local/bin/backup.sh User=backup Group=backup # Optional: Resource Limits MemoryMax=512M CPUQuota=50%
# 2. Timer erstellen # /etc/systemd/system/backup.timer [Unit] Description=Run Backup Daily [Timer] # Täglich um 3:00 Uhr OnCalendar=*-*-* 03:00:00 # Verpasste Runs nachholen Persistent=true # Zufällige Verzögerung (verhindert Lastspitzen) RandomizedDelaySec=300 [Install] WantedBy=timers.target
# 3. Timer aktivieren sudo systemctl daemon-reload sudo systemctl enable backup.timer sudo systemctl start backup.timer
OnCalendar Syntax
# Format: DayOfWeek Year-Month-Day Hour:Minute:Second # Jeden Tag um 14:30 OnCalendar=*-*-* 14:30:00 # Jeden Montag um 9:00 OnCalendar=Mon *-*-* 09:00:00 # Jeden 1. des Monats OnCalendar=*-*-01 00:00:00 # Alle 15 Minuten OnCalendar=*:0/15 # Werktags 9-17 Uhr, jede Stunde OnCalendar=Mon..Fri *-*-* 09..17:00:00 # Spezielle Shortcuts OnCalendar=hourly OnCalendar=daily OnCalendar=weekly OnCalendar=monthly # Validieren systemd-analyze calendar "Mon *-*-* 09:00:00"
Monotone Timer
# Zeit relativ zu einem Event [Timer] # 5 Minuten nach System-Boot OnBootSec=5min # 10 Minuten nach Timer-Aktivierung OnActiveSec=10min # Alle 2 Stunden (nach letztem Run) OnUnitActiveSec=2h # Alle 30 Minuten (nach letztem Start) OnUnitInactiveSec=30min # Kombiniert: Boot + wiederholen OnBootSec=5min OnUnitActiveSec=1h
Praktische Beispiele
Log-Rotation
# /etc/systemd/system/logrotate.service [Unit] Description=Rotate Logs [Service] Type=oneshot ExecStart=/usr/sbin/logrotate /etc/logrotate.conf # /etc/systemd/system/logrotate.timer [Unit] Description=Daily Log Rotation [Timer] OnCalendar=daily AccuracySec=1h Persistent=true [Install] WantedBy=timers.target
Datenbank-Cleanup
# /etc/systemd/system/db-cleanup.service [Unit] Description=Database Cleanup Requires=postgresql.service After=postgresql.service [Service] Type=oneshot ExecStart=/usr/local/bin/cleanup-old-records.sh User=postgres # /etc/systemd/system/db-cleanup.timer [Unit] Description=Weekly Database Cleanup [Timer] OnCalendar=Sun 02:00 Persistent=true [Install] WantedBy=timers.target
SSL-Zertifikat erneuern
# /etc/systemd/system/certbot-renew.service [Unit] Description=Certbot Renewal [Service] Type=oneshot ExecStart=/usr/bin/certbot renew --quiet ExecStartPost=/bin/systemctl reload nginx # /etc/systemd/system/certbot-renew.timer [Unit] Description=Certbot Renewal Timer [Timer] OnCalendar=*-*-* 00,12:00:00 RandomizedDelaySec=43200 Persistent=true [Install] WantedBy=timers.target
Timer verwalten
# Alle Timer anzeigen systemctl list-timers --all # Timer-Status systemctl status backup.timer # Timer manuell triggern (Service starten) systemctl start backup.service # Timer-Logs journalctl -u backup.service journalctl -u backup.timer # Nächste Ausführungszeiten systemctl list-timers # Timer deaktivieren systemctl stop backup.timer systemctl disable backup.timer
Fehlerbehandlung
# /etc/systemd/system/important-task.service [Unit] Description=Important Task [Service] Type=oneshot ExecStart=/usr/local/bin/task.sh # Bei Fehler: Restart versuchen Restart=on-failure RestartSec=60 # E-Mail bei Fehler ExecStopPost=/bin/sh -c 'if [ "$$EXIT_STATUS" != "0" ]; then echo "Task failed" | mail -s "Task Error" admin@example.com; fi' # Oder: OnFailure Unit OnFailure=notify-failure@%n.service
User Timer (ohne Root)
# ~/.config/systemd/user/myscript.service [Unit] Description=My Script [Service] Type=oneshot ExecStart=%h/bin/myscript.sh # ~/.config/systemd/user/myscript.timer [Unit] Description=Run My Script [Timer] OnCalendar=hourly Persistent=true [Install] WantedBy=timers.target # Aktivieren systemctl --user daemon-reload systemctl --user enable myscript.timer systemctl --user start myscript.timer # User-Timer nach Boot starten (ohne Login) loginctl enable-linger username
💡 Tipp:
Überwachen Sie Ihre Timer-Jobs mit dem Enjyn Status Monitor und erhalten Sie Alerts bei Fehlern.