Leitfaden zu Systemd-Timern: Cron-Jobs für zuverlässige Planung ersetzen
Jahrzehntelang war cron der De-facto-Standard für die Terminierung von Aufgaben auf Linux- und Unix-ähnlichen Systemen. Seine Einfachheit und Allgegenwart machten es sowohl für Administratoren als auch für Entwickler zu einem unverzichtbaren Werkzeug. Als sich Linux-Systeme jedoch weiterentwickelten, insbesondere mit dem Aufkommen von systemd als System- und Dienstemanager, wurden robustere und besser integrierte Planungsmechanismen verfügbar. systemd-Timer-Units (.timer-Dateien) bieten eine moderne, leistungsstarke und oft überlegene Alternative zu traditionellen cron-Jobs.
Dieser Leitfaden untersucht die Vorteile von systemd-Timern und erläutert, wie sie sich nahtlos in den Rest des systemd-Ökosystems integrieren. Wir führen Sie umfassend durch die Konfiguration von Timer- (.timer) und Service-Dateien (.service), sodass Sie robuste, reproduzierbare und leicht verwaltbare geplante Aufgaben erstellen können. Am Ende dieses Artikels werden Sie verstehen, warum systemd-Timer oft die bevorzugte Wahl für eine zuverlässige Aufgabenplanung in modernen Linux-Umgebungen sind.
Systemd-Timer verstehen
systemd-Timer sind systemd-Unit-Dateien, die steuern, wann andere systemd-Units, typischerweise service-Units, aktiviert werden. Im Gegensatz zu cron, das ein eigenständiger Daemon ist, sind systemd-Timer ein integraler Bestandteil des systemd-Init-Systems. Diese tiefe Integration bringt mehrere erhebliche Vorteile mit sich, insbesondere in Bezug auf Zuverlässigkeit, Protokollierung und Ressourcenverwaltung.
A systemd-Timer arbeitet immer in Verbindung mit einer anderen Unit, meistens einer service-Unit. Die .timer-Datei definiert, wann ein Ereignis auftreten soll, und die entsprechende .service-Datei definiert, welche Aktion ausgeführt werden soll, wenn dieses Ereignis ausgelöst wird. Diese klare Trennung der Verantwortlichkeiten macht systemd-Timer hochgradig modular und flexibel.
Wichtigste Vorteile von Systemd-Timern gegenüber Cron
Obwohl cron funktionsfähig ist, beheben systemd-Timer viele seiner Einschränkungen und bieten eine robustere und funktionsreichere PlanungsLösung:
- Zuverlässigkeit und Persistenz: Wenn ein
systemd-Timer mitPersistent=truekonfiguriert ist und das System während eines geplanten Laufs ausgeschaltet ist, wird der zugehörige Dienst kurz nach dem erneuten Hochfahren des Systems ausgeführt.cron-Jobs hingegen verpassen ihre geplanten Läufe einfach, wenn das System nicht verfügbar ist. - Integration mit
systemd: Timer profitieren von der leistungsstarken Protokollierung vonsystemd(überjournalctl), dem Abhängigkeitsmanagement und der Ressourcensteuerung (cgroups). Dies bedeutet bessere Überwachung, klarere Fehlerberichterstattung und die Möglichkeit, komplexe Startsequenzen oder Ressourcengrenzen für geplante Aufgaben zu definieren. - Reproduzierbarkeit und Versionskontrolle:
systemd-Unit-Dateien sind einfache Textdateien, die leicht in Versionskontrollsystemen gespeichert werden können. Dies ermöglicht reproduzierbare Bereitstellungen und eine einfachere Nachverfolgung von Änderungen an geplanten Aufgaben auf mehreren Systemen. - Ereignisbasierte Planung: Über die einfache zeitbasierte Planung hinaus können
systemd-Timer relativ zum Systemstart (OnBootSec) oder nach der letzten Aktivierung einer Unit (OnUnitActiveSec) ausgelöst werden, was dynamischere Planungsoptionen bietet. - Flexible Zeitangaben:
systemdbietet eine reichhaltige Auswahl an Kalenderereignis-Ausdrücken, die oft lesbarer und vielseitiger sind als die Syntax voncron, einschließlich stündlicher, täglicher, wöchentlicher und spezifischer Datums-/Zeitangaben. - Ressourcenmanagement und Abhängigkeiten: Von Timern gestartete
systemd-Dienste erben diesystemd-Umgebung, einschließlich cgroup-Einstellungen, und können Abhängigkeiten von anderensystemd-Units deklarieren (z. B. Warten, bis das Netzwerk oder eine Datenbank verfügbar ist, bevor sie ausgeführt werden). - Behandlung von Standardausgabe/Fehlerausgabe:
systemderfasst automatischstdoutundstderrvon durch Timer gestarteten Diensten und leitet diese in das Systemprotokoll weiter, was das Debugging und die Überprüfung viel einfacher macht als bei der E-Mail-basierten Ausgabe voncronoder manueller Umleitung.
Systemd-Timer konfigurieren
Die Konfiguration eines systemd-Timers umfasst die Erstellung von zwei Unit-Dateien: einer Service-Unit (.service) und einer Timer-Unit (.timer). Diese Dateien werden typischerweise für systemweite Timer in /etc/systemd/system/ oder für benutzerspezifische Timer in ~/.config/systemd/user/ abgelegt.
1. Die Service-Unit (.service-Datei)
Die Service-Unit definiert den tatsächlichen Befehl oder das Skript, das ausgeführt werden soll. Es ist eine Standard-systemd-Service-Datei, die jedoch oft für die nicht-interaktive Ausführung und zur Durchführung einer bestimmten Aufgabe konzipiert ist.
Beispiel: /etc/systemd/system/mytask.service
[Unit]
Description=Mein geplanter Task-Dienst
[Service]
Type=oneshot
ExecStart=/usr/local/bin/mytask.sh
User=myuser
Group=mygroup
# Optional: Ressourcen begrenzen
# CPUShares=512
# MemoryLimit=1G
[Install]
WantedBy=multi-user.target
Erklärung:
[Unit]: Enthält allgemeine Informationen über die Unit.Description: Eine für Menschen lesbare Beschreibung.
[Service]: Definiert die Service-spezifische Konfiguration.Type=oneshot: Zeigt an, dass der Dienst einen einzelnen Befehl ausführt und dann beendet wird. Dies ist üblich für geplante Aufgaben.ExecStart: Der auszuführende Befehl oder das Skript. Geben Sie den vollständigen Pfad an.User,Group: Definiert den Benutzer und die Gruppe, unter denen der Befehl ausgeführt wird. Führen Sie Aufgaben immer mit den geringstmöglichen Berechtigungen aus.CPUShares,MemoryLimit: (Optional)systemdermöglicht es Ihnen, Ressourcengrenzen für Dienste festzulegen, indem cgroups genutzt werden.
[Install]: Definiert, wie die Unit aktiviert werden soll.WantedBy=multi-user.target: Obwohl vorhanden, ist dieser Abschnitt für timer-ausgelöste Dienste oft weniger kritisch, da die Timer-Unit selbst normalerweise die Aktivierung bestimmt. Er kann jedoch nützlich sein, wenn Sie den Dienst auch manuell aktivieren möchten oder ihn in anderesystemd-Ziele integrieren möchten.
2. Die Timer-Unit (.timer-Datei)
Die Timer-Unit definiert, wann die entsprechende Service-Unit aktiviert werden soll. Sie muss denselben Namen wie ihr Service-Gegenstück haben (z. B. mytask.timer für mytask.service).
Beispiel: /etc/systemd/system/mytask.timer
[Unit]
Description=Führt mytask.service täglich aus
[Timer]
OnCalendar=daily
Persistent=true
RandomizedDelaySec=600
AccuracySec=1min
[Install]
WantedBy=timers.target
Erklärung:
[Unit]: Allgemeine Informationen.Description: Eine Beschreibung für den Timer.
[Timer]: Definiert die Timer-spezifische Konfiguration.OnCalendar: Die häufigste Einstellung, die ein Kalenderereignis definiert. Sie verwendet Ausdrücke wie:daily: Jeden Tag um Mitternacht.weekly: Jeden Montag um Mitternacht.monthly: Am ersten Tag jedes Monats um Mitternacht.hourly: Jede Stunde zur vollen Stunde.*-*-* 03:00:00: Jeden Tag um 3:00 Uhr morgens.Mon..Fri 08:00..17:00: Wochentage zwischen 8 und 17 Uhr.Mon *-*-* 03:00:00: Jeden Montag um 3 Uhr morgens.
OnBootSec: Aktiviert den Dienst nach einer angegebenen Zeit nach dem Systemstart. Z. B.OnBootSec=10min.OnUnitActiveSec: Aktiviert den Dienst nach einer angegebenen Zeit seit der letzten Aktivierung des Dienstes. Z. B.OnUnitActiveSec=1hfür stündliche Ausführung nach Abschluss des vorherigen Laufs.Persistent=true: Entscheidend für die Zuverlässigkeit. Wenn das System während eines geplanten Laufs ausgeschaltet ist, wird der Dienst kurz nach dem nächsten Booten ausgelöst.RandomizedDelaySec=600: Fügt der geplanten Zeit eine zufällige Verzögerung (bis zu 600 Sekunden) hinzu. Nützlich, um ein "