Systemd Timer Units meistern: Ein umfassender Leitfaden
Systemd, der allgegenwärtige System- und Servicemanager für Linux, bietet eine leistungsstarke und flexible Alternative zu traditionellen Cron-Jobs für die Planung von Aufgaben. Systemd Timer Units, eine Funktion, die direkt in das Systemd-Ökosystem integriert ist, bieten verbesserte Kontrolle, bessere Integration mit Systemdiensten und granularere Protokollierungsfunktionen. Dieser Leitfaden führt Sie durch den Prozess der Erstellung, Verwaltung und Überwachung von Systemd Timer Units, damit Sie Aufgaben mit Zuversicht und Effizienz automatisieren können.
Während Cron seit Jahrzehnten die erste Wahl für die Aufgabenplanung ist, bieten Systemd Timer mehrere Vorteile. Sie können direkt an Service Units gebunden werden, was bedeutet, dass ein Timer einen Dienst nur aktivieren kann, wenn das System bereit ist, oder ein Dienst gestoppt werden kann, wenn ein Timer abläuft, bevor er abgeschlossen ist. Diese enge Integration vereinfacht die Verwaltung komplexer Abhängigkeiten. Darüber hinaus bietet die Protokollierungsinfrastruktur von Systemd (journald) ein zentralisiertes und durchsuchbares Protokoll für alle Timer-Aktivitäten, was die Fehlersuche erheblich erleichtert, als sich durch verstreute Cron-Protokolle zu wühlen.
Struktur von Systemd Timer Units verstehen
Eine Systemd Timer Unit wird immer mit einer entsprechenden Service Unit (oder einem anderen Unit-Typ) gekoppelt, die sie aktivieren soll. Die Timer Unit selbst definiert, wann die zugehörige Unit aktiviert werden soll, während die Service Unit definiert, welche Aktion ausgeführt werden soll. Beide Units befinden sich in der Regel im selben Verzeichnis, für benutzerdefinierte Units oft unter /etc/systemd/system/.
Eine typische Timer Unit-Datei hat die Erweiterung .timer, und ihre zugehörige Service Unit-Datei hat die Erweiterung .service. Wenn Sie beispielsweise eine Aufgabe planen möchten, die in mytask.service definiert ist, würden Sie eine Datei mytask.timer erstellen.
Beispiel: mytask.timer-Struktur
[Unit]
Description=Meine benutzerdefinierte Aufgabe täglich ausführen
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
Lassen Sie uns die wichtigsten Abschnitte aufschlüsseln:
-
[Unit]-Abschnitt:Description: Eine für Menschen lesbare Beschreibung des Timers. Dies ist hilfreich zur Identifizierung in Statusausgaben.
-
[Timer]-Abschnitt: Dies ist der Kern der Timer Unit, der die Planung definiert.OnCalendar=daily: Diese Direktive gibt an, wann der Timer aktiviert werden soll.dailyist eine Kurzform für*-*-* 00:00:00. Systemd unterstützt eine Vielzahl von Kalenderereignisspezifikationen, ähnlich wie Cron, aber mit mehr Flexibilität. Andere Beispiele sind:hourly: Jede Stunde.weekly: Jede Woche (entsprichtMon *-*-* 00:00:00).Sun *-*-* 10:00: Jeden Sonntag um 10 Uhr.*-*-15 14:30: Am 15. jeden Monats um 14:30 Uhr.Mon..Fri *-*-* 09:00: Wochentags um 9 Uhr.
Persistent=true: Wenn dies auftruegesetzt ist, wird der Timer so bald wie möglich aktiviert, wenn das Ereignis aufgetreten ist, während das System ausgeschaltet war. BeiOnCalendar-Timern bedeutet dies, dass der Timer einmal ausgelöst wird, sobald das System hochgefahren ist und der Timer aktiv wird, wenn das System während der geplanten Zeit ausgeschaltet war.OnBootSec=: Aktiviert den Timer eine bestimmte Zeit nach dem Systemstart. Zum Beispiel würdeOnBootSec=15min15 Minuten nach dem Start auslösen.OnUnitActiveSec=: Aktiviert den Timer eine bestimmte Zeit, nachdem die Einheit, die er aktiviert (z. B. der Dienst), zuletzt aktiv wurde. Zum Beispiel würdeOnUnitActiveSec=1heine Stunde nach Abschluss des zugehörigen Dienstes ausgelöst.OnUnitInactiveSec=: Aktiviert den Timer eine bestimmte Zeit, nachdem die Einheit, die er aktiviert, zuletzt inaktiv wurde.AccuracySec=: Gibt die Genauigkeit des Timers an. Systemd versucht, das System für Timer nur dann aufzuwecken, wenn das Ereignis innerhalb dieses Zeitfensters liegt, um Strom zu sparen. Standardmäßig1min.RandomizedDelaySec=: Fügt eine zufällige Verzögerung zum Auslösen des Timers hinzu, bis zur angegebenen Dauer. Nützlich zur Verteilung der Last.
-
[Install]-Abschnitt: Dieser Abschnitt definiert, wie die Timer Unit aktiviert werden kann.WantedBy=timers.target: Diese Direktive stellt sicher, dass der Timer, wenn er aktiviert wird, Teil destimers.targetwird, einem Standardziel, das alle aktiven Timer enthält. Das bedeutet, dass der Timer nach der Aktivierung automatisch beim Start ausgeführt wird.
Beispiel: mytask.service-Struktur
[Unit]
Description=Mein benutzerdefinierter Task-Dienst
[Service]
Type=oneshot
ExecStart=/usr/local/bin/my_custom_script.sh
User=myuser
Group=mygroup
[Install]
WantedBy=multi-user.target
-
[Unit]-Abschnitt:Description: Eine Beschreibung des Dienstes.
-
[Service]-Abschnitt: Dies definiert den Dienst selbst.Type=oneshot: Geeignet für Aufgaben, die einmal ausgeführt und dann beendet werden. Es gibt andere Typen für langlebige Daemons.ExecStart: Der auszuführende Befehl. Stellen Sie sicher, dass das Skript über Ausführungsberechtigungen verfügt.User/Group: Gibt den Benutzer und die Gruppe an, unter denen der Befehl ausgeführt werden soll. Es ist eine gute Praxis, Aufgaben nicht als Root auszuführen, es sei denn, dies ist unbedingt erforderlich.
-
[Install]-Abschnitt: Dieser Abschnitt ist normalerweise für Dienste vorhanden, die beim Start ausgeführt werden sollen, obwohl dies für einen Dienst, der von einem Timer ausgelöst wird, möglicherweise nicht unbedingt erforderlich ist, wenn er nur vom Timer gestartet werden soll.
Erstellen und Aktivieren von Timer Units
Befolgen Sie diese Schritte, um Ihre Systemd Timer Units zu erstellen und zu verwalten:
-
Erstellen Sie die Service Unit-Datei: Definieren Sie Ihre Aufgabe in einer
.service-Datei. Speichern Sie sie in/etc/systemd/system/(oder~/.config/systemd/user/für benutzerspezifische Timer).
bash sudo nano /etc/systemd/system/mytask.service
Fügen Sie den obigen Beispiel-Serviceinhalt ein und speichern Sie. -
Erstellen Sie die Timer Unit-Datei: Definieren Sie den Zeitplan in einer entsprechenden
.timer-Datei. Speichern Sie sie im selben Verzeichnis wie die Service-Datei.
bash sudo nano /etc/systemd/system/mytask.timer
Fügen Sie den obigen Beispiel-Timer-Inhalt ein und speichern Sie. -
Systemd Daemon neu laden: Nach dem Erstellen oder Ändern von Unit-Dateien müssen Sie Systemd mitteilen, seine Konfiguration neu zu laden.
bash sudo systemctl daemon-reload -
Timer aktivieren: Um sicherzustellen, dass der Timer beim Start automatisch startet, aktivieren Sie ihn.
bash sudo systemctl enable mytask.timer
Hinweis: Sie aktivieren die Service-Datei NICHT, wenn sie ausschließlich vom Timer ausgelöst werden soll. -
Timer starten: Starten Sie den Timer sofort. Er wird dann nach seinem Zeitplan ausgeführt.
bash sudo systemctl start mytask.timer
Verwalten und Überwachen von Timer Units
Systemd bietet mehrere systemctl-Befehle zur Verwaltung und Überwachung Ihrer Timer:
-
Alle Timer auflisten: Alle aktiven und inaktiven Timer anzeigen.
bash systemctl list-timers
Dieser Befehl liefert eine Ausgabe wie diese:
NÄCHSTE VERBLEIBEND LETZTE VERGANGEN UNIT AKTIVIERT Di 27.10.2023 08:00:00 UTC 10h verbleibend Mi 26.10.2023 08:00:00 UTC 14h her mytask.timer mytask.service
Dies zeigt an, wann der Timer als Nächstes ausgeführt werden soll, wie lange es bis zur Ausführung dauert, wann er zuletzt ausgeführt wurde und welchen Dienst er aktiviert. -
Timer für eine bestimmte Unit auflisten: Wenn Sie Timer anzeigen möchten, die sich auf einen bestimmten Dienst beziehen.
bash systemctl list-timers --all | grep mytask.service -
Timer-Status prüfen: Detaillierte Informationen zu einem bestimmten Timer erhalten.
bash systemctl status mytask.timer
Dies zeigt an, ob der Timer aktiv ist, wann er als Nächstes ausgeführt werden soll und die letzten Protokolleinträge. -
Service-Protokolle anzeigen: Um die Ausgabe und den Status der vom Timer ausgeführten Aufgabe anzuzeigen, überprüfen Sie die Protokolle des zugehörigen Dienstes.
bash journalctl -u mytask.service
Sie können die Protokolle auch in Echtzeit verfolgen:
bash journalctl -f -u mytask.service -
Timer stoppen: Wenn Sie einen Timer vorübergehend deaktivieren müssen.
bash sudo systemctl stop mytask.timer -
Timer deaktivieren: Um zu verhindern, dass ein Timer beim Start ausgeführt wird, und ihn stoppen, falls er läuft.
bash sudo systemctl disable mytask.timer
Erweiterte Timer-Konfigurationen
Festlegen spezifischer Intervalle
Anstelle von daily oder hourly können Sie präzisere Intervalle definieren:
- Alle N Minuten:
OnUnitActiveSec=15min(läuft 15 Minuten nach Abschluss des Dienstes). - Spezifische Zeiten:
OnCalendar=*-*-* 02:30:00(läuft täglich um 02:30 Uhr). - Bedingungen kombinieren:
OnCalendar=Mon..Fri *-*-* 08:00:00(läuft wochentags um 08:00 Uhr).
Verwendung von AccuracySec zur Stromeinsparung
Wenn Ihre Aufgabe nicht zu einem exakten Zeitpunkt ausgeführt werden muss, sollten Sie AccuracySec verwenden. Zum Beispiel teilt AccuracySec=5min Systemd mit, dass es in Ordnung ist, das System innerhalb von 5 Minuten nach der geplanten Zeit aufzuwecken. Dies ermöglicht es Systemd, Timer-Ereignisse zu bündeln und das System möglicherweise länger in einem niedrigeren Stromsparmodus zu halten.
[Timer]
OnCalendar=hourly
AccuracySec=5min
Persistent vs. WakeUpOn
Persistent=truestellt sicher, dass, wenn einOnCalendar-Ereignis aufgrund eines ausgeschalteten Systems verpasst wird, es beim nächsten Start einmal ausgeführt wird. Dies ist entscheidend für Aufgaben, die nicht übersprungen werden dürfen.WakeUpOn=(z. B.WakeUpOn=battery,WakeUpOn=ac) kann verwendet werden, um Bedingungen anzugeben, unter denen das System für Timer aufgeweckt werden soll. Dies ist fortgeschrittener und wird oft in Verbindung mitsystemd-suspend.serviceverwendet.
Timer vs. Cron
| Merkmal | Systemd Timer | Cron |
|---|---|---|
| Integration | Tiefe Integration mit Systemd-Diensten, Zielen | Eigenständiges Dienstprogramm |
| Zeitplanung | Flexibel (Kalender, relativ, startbasiert) | Hauptsächlich zeitbasierte Ausdrücke |
| Protokollierung | Zentralisiert über journalctl |
Verstreut (/var/log/syslog, /var/log/cron.log) |
| Fehlerbehandlung | Kann Aktionen an Dienstfehler koppeln | Grundlegende E-Mail-Benachrichtigungen |
| Abhängigkeiten | Kann von anderen aktiven Diensten abhängen | Begrenzt |
| Ausführung | Kann als spezifische Benutzer, Gruppen ausgeführt werden | Kann über crontab als spezifische Benutzer ausgeführt werden |
| Stromverwaltung | Kann für Stromersparnis optimiert werden (AccuracySec) |
Weniger direkte Kontrolle |
Wann Systemd Timer zu wählen sind:
- Wenn Sie eine engere Integration mit anderen Systemd-Diensten benötigen.
- Wenn zentralisierte Protokollierung und einfacheres Debugging Priorität haben.
- Wenn Sie fortgeschrittenere Planungsoptionen benötigen (z. B. Zeit seit der letzten Ausführung).
- Für Aufgaben im Zusammenhang mit dem Systemzustand oder der Stromverwaltung.
Wann Cron immer noch bevorzugt werden könnte:
- Für sehr einfache, eigenständige Aufgaben auf Systemen, die Systemd nicht vollständig nutzen.
- Für maximale Kompatibilität über verschiedene Linux-Distributionen und ältere Systeme hinweg.
Behebung gängiger Probleme
- Aufgabe wird nicht ausgeführt:
- Timer-Status prüfen:
systemctl status mytask.timer. Achten Sie auf Meldungen wieActive: activeundTriggered.... - Service-Protokolle prüfen:
journalctl -u mytask.service. Stellen Sie sicher, dass das Skript ausführbar ist und keine Fehler aufweist. OnCalendar-Syntax überprüfen: Verwenden Siesystemd-analyze calendar 'ihr-kalender-string', um zu testen.- Stellen Sie sicher, dass der Timer aktiviert und gestartet wurde:
systemctl list-timers --all.
- Timer-Status prüfen:
- Aufgabe wird zu früh/zu spät ausgeführt:
AccuracySecundRandomizedDelaySecprüfen.- Stellen Sie sicher, dass die Systemuhr korrekt ist (
timedatectl status).
- Berechtigungsfehler:
- Bestätigen Sie, dass der in der
.service-Datei angegebeneUserundGroupdie erforderlichen Berechtigungen für das Skript und alle von ihm aufgerufenen Dateien haben. - Wenn kein Benutzer angegeben ist, wird standardmäßig Root verwendet. Seien Sie vorsichtig mit Root-Berechtigungen.
- Bestätigen Sie, dass der in der
Fazit
Systemd Timer Units bieten einen robusten und modernen Ansatz für die Planung von Aufgaben auf Linux-Systemen. Indem Sie ihre Struktur, Erstellung und Verwaltung verstehen, können Sie Routinevorgänge effektiv automatisieren, die Systemzuverlässigkeit verbessern und die volle Leistungsfähigkeit des Systemd-Ökosystems nutzen. Denken Sie daran, den Daemon nach Änderungen immer neu zu laden, den Timer für die Persistenz zu aktivieren und journalctl für eine effiziente Überwachung und Fehlerbehebung zu nutzen.