Arbeiten mit systemd
-Zeitgebern
- WAS?
Von der Ausführung eines Sicherungsskripts in regelmäßigen Abständen bis hin zum Starten eines bestimmten Prozesses, sobald der Computer gebootet wird – es gibt unzählige Aufgaben auf einem Linux-System, die zeitlich geplant werden müssen.
systemd
-Zeitgeber stellen einen flexiblen Mechanismus für die Planung und Verwaltung von Aufträgen und Diensten bereit.- WARUM?
In diesem Artikel erhalten Sie einen vollständigen Überblick über
systemd
-Zeitgeber für die Erstellung, Wartung, Tests, Fehlersuche und Migration des cron-Daemon.- AUFWAND
Das Erstellen eines Beispiels für einen
systemd
-Zeitgeber dauert 10 Minuten. Sie brauchen bis zu 30 Minuten, um sich mit der Funktionsweise dersystemd
-Zeitgeber vollständig vertraut zu machen.- ANFORDERUNGEN
Grundlegende Kenntnisse von
systemd
.root
- oder sudo-Rechte. Wenn Sie diesystemd
-Zeitgeber als normaler Benutzer verwenden möchten, lesen Sie zuerst die Anweisungen in Abschnitt 7, „Verwenden von Zeitgebern als normaler Benutzer“.
1 Das Konzept der systemd
-Zeitgeber #
systemd
-Zeitgeber-Units bieten einen Mechanismus für die Planung von Aufträgen unter Linux. Die Ausführungszeit dieser Aufträge kann sich auf die Uhrzeit und das Datum oder auf Ereignisse beziehen.
systemd
-Zeitgeber-Units sind mit der Dateinamenerweiterung .timer
gekennzeichnet. Für jede Zeitgeberdatei muss eine entsprechende Dienstdatei vorliegen, die durch die Zeitgeberdatei gesteuert wird. Mit anderen Worten: Eine Zeitgeberdatei aktiviert und verwaltet die entsprechende Dienstdatei. systemd
-Zeitgeber unterstützen die folgenden Funktionen:
Aufträge, die mit einer Zeitgeber-Unit geplant werden, können von anderen
systemd
-Diensten abhängig sein. Zeitgeber-Units werden wie normalesystemd
-Dienste behandelt und können daher mitsystemctl
verwaltet werden.Es stehen Echtzeit-Zeitgeber (Auslösung bei Kalenderereignissen) und monotone Zeitgeber (Auslösung, wenn eine bestimmte Zeit nach einem bestimmten Startpunkt abgelaufen ist) zur Auswahl.
Zeiteinheiten werden im Systemjournal protokolliert, was die Überwachung und Fehlersuche erleichtert.
Zeitgeber greifen auf die zentralen
systemd
-Verwaltungsdienste zurück.Falls das System zur erwarteten Ausführungszeit ausgeschaltet ist, wird der Zeitgeber ausgeführt, sobald das System wieder läuft.
2 Erstellen eines Zeitgebers #
Im folgenden Beispiel wird gezeigt, wie Sie einen Zeitgeber festlegen, der das helloworld.sh
-Shell-Skript nach dem Bootvorgang auslöst und seine Ausführung alle 24 Stunden relativ zur Aktivierungszeit wiederholt. Eine zusätzliche Ausführung erfolgt montags bis freitags um 10:00 Uhr.
2.1 Hello World-Beispiel #
Erstellen Sie die Datei
/etc/systemd/system/helloworld.service
mit folgendem Inhalt:[Unit] Description="Hello World script" [Service] ExecStart=/usr/local/bin/helloworld.sh
Dies ist eine
systemd
-Dienstdatei, diesystemd
mitteilt, welche Anwendung ausgeführt werden soll.Erstellen Sie die Datei
/etc/systemd/system/helloworld.timer
mit folgendem Inhalt:[Unit] Description="Run helloworld.service 5min after boot and every 24 hours relative to activation time" [Timer] OnBootSec=5min OnUnitActiveSec=24h OnCalendar=Mon..Fri *-*-* 10:00:* Unit=helloworld.service [Install] WantedBy=multi-user.target
Dies ist die Zeitgeberdatei, die die Aktivierung der zugehörigen Dienstdatei steuert.
Vergewissern Sie sich, dass die oben erstellten Dateien fehlerfrei sind:
>
systemd-analyze verify /etc/systemd/system/helloworld.*Wenn das Kommando keine Ausgabe zurückgibt, haben die Dateien die Überprüfung erfolgreich bestanden.
Starten Sie den Zeitgeber:
>
sudo
systemctl start helloworld.timerAktiviert den Zeitgeber nur für die aktuelle Sitzung.
Aktivieren Sie den Zeitgeber, damit er beim Booten definitiv aktiviert wird:
>
sudo
systemctl enable helloworld.timer
2.2 Erläuterung des Beispiels #
[Unit] Description="Hello World script"1 [Service] ExecStart=/usr/local/bin/helloworld.sh2
Eine kurze Beschreibung, in der der Zweck der Dienstdatei erläutert wird. | |
Die auszuführende Anwendung. |
Die Abschnitte [Unit]
und [Service]
sind mindestens erforderlich, damit eine Dienstdatei funktioniert. systemd
-Dienstdateien enthalten normalerweise einen Abschnitt [Install]
mit einem oder mehreren Targets, die ein Dienst laden soll. Dieser Abschnitt ist bei Dienstdateien für Zeitgeber nicht erforderlich, da diese Informationen in der Zeitgeberdatei enthalten sind. Informationen zur erweiterten Konfiguration finden Sie unter Managing
systemd
targets with systemctl.
[Unit] Description="Run helloworld.service 5min after boot and every 24 hours relative to activation time"1 [Timer] OnBootSec=5min2 OnUnitActiveSec=24h3 OnCalendar=Mon..Fri *-*-* 10:00:*4 Unit=helloworld.service5 [Install] WantedBy=multi-user.target6
Eine kurze Beschreibung, in der der Zweck der Zeitgeberdatei erläutert wird. | |
Legt einen Zeitgeber fest, der den Dienst fünf Minuten nach dem Booten des Systems auslöst. Ausführliche Informationen finden Sie unter Monotone Zeitgeber. | |
Legt einen Zeitgeber fest, der den Dienst 24 Stunden nach der Aktivierung des Dienstes auslöst (d. h. der Zeitgeber löst den Dienst einmal täglich aus). Ausführliche Informationen finden Sie unter Echtzeit-Zeitgeber. | |
Legt eine Zeitgeber fest, der den Dienst zu festen Zeitpunkten auslöst (in diesem Beispiel montags bis freitags um 10:00 Uhr). Ausführliche Informationen finden Sie unter Echtzeit-Zeitgeber. | |
Die auszuführende Dienstdatei. | |
Das |
3 Verwalten von Zeitgebern #
Sie können Zeitgeber mit dem Kommando systemctl
verwalten.
- Starten und Stoppen von Zeitgebern
>
sudo
systemctl start TIMER.timer>
sudo
systemctl restart TIMER.timer>
sudo
systemctl stop TIMER.timer- Aktivieren und Deaktivieren von Zeitgebern
>
sudo
systemctl enable TIMER.timer>
sudo
systemctl disable TIMER.timer- Anzeigen des Inhalts der Zeitgeberdatei
>
sudo
systemctl cat TIMER.timer- Prüfen eines bestimmten Zeitgebers
>
sudo
systemctl status TIMER.timerBeispiel 3: Zeitgeberstatus #>
sudo
systemctl status helloworld.timer ● helloworld.timer - "Run helloworld.service 5min after boot and every 24 hours relative to activation time"1 Loaded: loaded (/etc/systemd/system/helloworld.timer; disabled; vendor preset: disabled)2 Active: active (waiting) since Tue 2022-10-26 18:35:41 CEST; 6s ago3 Trigger: Wed 2022-10-27 18:35:41 CEST; 23h left4 Triggers: ● helloworld.service5 6 Oct 26 18:35:41 neo systemd[1]: Started "Run helloworld.service 5min after boot and every 24 hours relative to activation time".7Der Dateiname und die Beschreibung des Zeitgebers.
Listet auf, ob ein Zeitgeber erfolgreich analysiert wurde und im Speicher gehalten wird (geladen), zeigt den vollständigen Pfad zur Zeitgeberdatei an und gibt an, ob der Zeitgeber beim Booten gestartet wird (aktiviert) oder nicht (deaktiviert). Der erste Wert zeigt die aktuelle Systemkonfiguration, der zweite Wert die Voreinstellung des Herstellers.
Gibt an, ob der Zeitgeber aktiv ist (darauf wartet, Ereignisse auszulösen) oder inaktiv ist. Wenn er aktiv ist, wird auch die Zeit angezeigt, die seit der letzten Aktivierung vergangen ist (in diesem Beispiel 6 Sekunden).
Datum und Uhrzeit der nächsten Auslösung des Zeitgebers.
Name der Dienstdatei, die der Zeitgeber auslöst.
Optionale Zeile, die auf die Dokumentation verweist (z. B. auf man-Seiten). Falls nicht verfügbar, wird eine leere Zeile angezeigt (wie in diesem Beispiel).
Letzter Journaleintrag, der durch den Zeitgeber erstellt wurde.
Mit systemctl list-timers
rufen Sie eine Liste aller auf dem System verfügbaren Zeitgeber ab. Folgende Optionen sind verfügbar:
- Alle aktiven Zeitgeber auflisten:
>
sudo
systemctl list-timers- Alle Zeitgeber auflisten, auch inaktive Zeitgeber:
>
sudo
systemctl list-timers --all- Alle Zeitgeber auflisten, die mit einem Schema übereinstimmen:
>
sudo
systemctl list-timers PATTERN>
sudo
systemctl list-timers --allPATTERNPATTERN muss ein Name oder ein Shell-Globbing-Ausdruck sein. Die Operatoren
*
,?
und[]
können verwendet werden. Weitere Informationen zu Globbing-Schemas finden Sie inman 7 glob
.- Zeitgeber auflisten, die einen bestimmten Status aufweisen:
>
sudo
systemctl list-timers --state=STATESTATE kann folgende Werte annehmen:
active
,failed
,load
,sub
. Ausführliche Informationen finden Sie unterman systemctl
.
Die Ausführung von systemctl list-timers
gibt eine ähnliche Tabelle wie hier dargestellt zurück. In diesem Beispiel werden alle aktiven Zeitgeber aufgelistet, die dem Schema snapper*
entsprechen:
>
sudo
systemctl list-timers snapper* NEXT1 LEFT2 LAST3 PASSED4 UNIT5 ACTIVATES6 ----------------------------------------------------------------------------------------------------------------------------- Tue 2022-10-26 19:00:00 CEST 39min left Tue 2022-10-26 18:00:29 CEST 19min ago snapper-timeline.timer snapper-timeline.service Wed 2022-10-27 08:33:04 CEST 14h left Tue 2022-10-26 08:33:04 CEST 9h ago snapper-cleanup.timer snapper-cleanup.service
Der Zeitpunkt, zu dem der Zeitgeber das nächste Mal ausgeführt wird. | |
Die verbleibende Zeit bis zur nächsten Ausführung des Zeitgebers. | |
Der Zeitpunkt, zu dem der Zeitgeber das letzte Mal ausgeführt wurde. | |
Der Zeitraum, der seit der letzten Ausführung des Zeitgebers vergangen ist. | |
Der Name der Zeitgeber-Unit. | |
Der Name des Dienstes, den der Zeitgeber aktiviert. |
4 Zeitgebertypen #
systemd
unterstützt zwei Arten von Zeitgebern: Echtzeit (basierend auf dem Kalender) und Monoton (basierend auf Ereignissen). Zeitgeber sind normalerweise dauerhaft, doch mit systemd
können auch vorübergehende Zeitgeber eingerichtet werden, die nur für die aktuelle Sitzung gelten.
- Echtzeit-Zeitgeber
Echtzeit-Zeitgeber werden durch Kalenderereignisse ausgelöst Sie werden mit der Option
OnCalendar
definiert.Sie können festlegen, wann ein Ereignis auf der Grundlage von Datum und Uhrzeit ausgelöst werden soll. Verwenden Sie die folgende Vorlage:
OnCalendar=DayOfWeek1 Year-Month-Day2 Hour:Minute:Second3
Wochentag. Mögliche Werte sind
Sun
,Mon
,Tue
,Wed
,Thu
,Fri
,Sat
. Lassen Sie diese Option aus, wenn der Wochentag ignoriert werden soll.Datum Geben Sie Monat und Tag mit zwei Ziffern an, das Jahr mit vier Ziffern. Jeder Wert kann durch das Platzhalterzeichen
*
ersetzt werden, damit jede Instanz gefunden wird.Uhrzeit Geben Sie jeden Wert mit je zwei Stellen an. Jeder Wert kann durch das Platzhalterzeichen
*
ersetzt werden, damit jede Instanz gefunden wird.Gilt für alle Werte: Mit zwei Punkten definieren Sie einen fortlaufenden Bereich (
Mon..Fri
). Eine Liste mit separaten Werten (Mon,Wed,Fri
) trennen Sie jeweils durch Kommas voneinander.Beispiel 5: Beispiele für Echtzeit-Zeitgeber #18:00 Uhr jeden Freitag:
OnCalendar=Fri *-*-* 18:00:00
5:00 Uhr täglich:
OnCalendar=Mon..Sun *-*-* 5:00:00
Sonntags und dienstags um 1:00 Uhr und 3:00 Uhr nachts:
OnCalendar=Tue,Sun *-*-* 01,03:00:00
Einzelnes Datum:
OnCalendar=Mo..Sun 2023-09-23 00:00:01
Sollen Auslöser zu verschiedenen Zeitpunkten angegeben werden, können Sie mehrere OnCalender-Einträge in einer einzelnen Zeitgeberdatei erstellen:
OnCalendar=Mon..Fri *-*-* 10:00 OnCalendar=Sat,Sun *-*-* 22:00
Eine vollständige Liste der verfügbaren Funktionen und Optionen finden Sie unter
man 7 systemd.time
. Dort erhalten Sie zusätzliche Informationen zu den folgenden Themen:Kürzen der Syntax und Verwendung von Abkürzungen
Wiederholungen festlegen
Bestimmte Tage in einem Monat finden (letzter Tag im Monat, letzter Sonntag usw.)
Zeitzonen anwenden
- Monotone Zeitgeber
Monotone Zeitgeber werden ausgelöst, sobald eine bestimmte Zeitspanne nach einem bestimmten Ereignis abgelaufen ist, z. B. nach dem Booten des Systems oder nach der Aktivierung einer System-Unit. Die Werte werden als Zeiteinheiten definiert (Minuten, Stunden, Tage, Monate, Jahre usw.). Die folgenden Einheiten werden unterstützt:
usec
,msec
,seconds
,minutes
,hours
,days
,weeks
,months
,years
. Für die Definition von monotonen Zeitgebern stehen mehrere Optionen zur Auswahl:OnActiveSec
: Zeit nach der Unit-AktivierungOnActiveSec=50minutes
OnBootSec
: Zeit nach dem Booten des SystemsOnBootSec=10hours
OnStartupSec
: Zeit nach dem Starten des Dienstmanagers. Bei Systemdiensten ist dies nahezu mitOnActiveSec
identisch. Verwenden Sie diese Option für Benutzerdienste, bei denen der Dienstmanager beim Anmelden des Benutzers gestartet wird.OnStartupSec=5minutes 20seconds
OnUnitActiveSec
: Zeit nach der letzten Aktivierung des entsprechenden DienstesOnUnitActiveSec=10seconds
OnUnitInactiveSec
: Zeit nach der letzten Deaktivierung des entsprechenden DienstesOnUnitInactiveSec=2hours 15minutes 18 seconds
- Vorübergehende Zeitgeber
Vorübergehende Zeitgeber sind temporäre Zeitgeber, die nur für die aktuelle Sitzung gelten. Bei diesem Zeitgeber können Sie entweder eine vorhandene Dienstdatei verwenden oder ein Programm direkt starten. Vorübergehende Zeitgeber werden mit
systemd-run
aufgerufen.Im folgenden Beispiel wird die Unit
helloworld.service
alle zwei Stunden ausgeführt:>
sudo
systemd-run --on-active="2hours" --unit="helloworld.service"Für die direkte Ausführung eines Kommandos gilt die folgende Syntax. In diesem Beispiel wird das Skript
/usr/local/bin/helloworld.sh
direkt aufgerufen:>
sudo
systemd-run --on-active="2hours" /usr/local/bin/helloworld.shWenn Parameter für das Kommando angegeben werden, trennen Sie sie jeweils mit einem Leerzeichen voneinander:
>
sudo
systemd-run --on-active="2hours" /usr/local/bin/helloworld.sh --language=pt_BRVorübergehende Zeitgeber können monotone Zeitgeber oder Echtzeit-Zeitgeber sein. Die folgenden Schalter werden unterstützt und funktionieren wie in Monotone Zeitgeber beschrieben:
--on-active
--on-startup
--on-unit-active
--on-unit-inactive
--on-calendar
Weitere Informationen hierzu finden Sie im
man 1 systemd-run
.
5 Testen von Kalendereinträgen #
systemd
bietet ein Tool zum Testen und Erstellen von Kalendereinträgen für Zeitgeber in Echtzeit: systemd-analyze calendar
. Dieses Werkzeug akzeptiert dasselbe Argument wie der Eintrag OnCalendar
, der für die Einrichtung von Echtzeit-Zeitgebern erforderlich ist.
Sie können mehrere Argumente angeben, jeweils mit einem Leerzeichen voneinander getrennt. Wenn der zu testende Begriff korrekt ist, zeigt Ihnen die Ausgabe, wann der Zeitgeber als nächstes ausgelöst wird (in Ortszeit und UTC). Es zeigt auch die Zeichenkette in Normalized form
an, und es wird empfohlen, diese Zeichenkette in der Zeitgeber-Datei zu verwenden. Die folgenden Beispiele dienen zur Verdeutlichung:
>
systemd-analyze calendar "Tue,Sun *-*-* 01,03:00:00" Normalized form: Tue,Sun *-*-* 01,03:00:00 Next elapse: Sun 2021-10-31 01:00:00 CEST (in UTC): Sat 2021-10-30 23:00:00 UTC From now: 3 days left>
systemd-analyze calendar "Mon..Fri *-*-* 10:00" "Sat,Sun *-*-* 22:00" Original form: Mon..Fri *-*-* 10:00 Normalized form: Mon..Fri *-*-* 10:00:00 Next elapse: Thu 2021-10-28 10:00:00 CEST (in UTC): Thu 2021-10-28 08:00:00 UTC From now: 19h left Original form: Sat,Sun *-*-* 22:00 Normalized form: Sat,Sun *-*-* 22:00:00 Next elapse: Sat 2021-10-30 22:00:00 CEST (in UTC): Sat 2021-10-30 20:00:00 UTC From now: 3 days left
Bei wiederholenden Zeitgebern listen Sie die Auslösezeiten mit dem Schalter –iterations N
auf und testen Sie dann, ob diese Einträge wie erwartet funktionieren. Das Argument N gibt die Anzahl der zu testenden Iterationen an. Die folgende Beispiel-Zeichenkette wird alle acht Stunden (beginnend um 00:00:00 Uhr) an Sonntagen ausgelöst:
>
systemd-analyze calendar --iterations 5 "Sun *-*-* 0/08:00:00"
Original form: Sun *-*-* 0/08:00:00
Normalized form: Sun *-*-* 00/8:00:00
Next elapse: Sun 2021-10-31 00:00:00 CEST
(in UTC): Sat 2021-10-30 22:00:00 UTC
From now: 3 days left
Iter. #2: Sun 2021-10-31 08:00:00 CET
(in UTC): Sun 2021-10-31 07:00:00 UTC
From now: 3 days left
Iter. #3: Sun 2021-10-31 16:00:00 CET
(in UTC): Sun 2021-10-31 15:00:00 UTC
From now: 4 days left
Iter. #4: Sun 2021-11-07 00:00:00 CET
(in UTC): Sat 2021-11-06 23:00:00 UTC
From now: 1 week 3 days left
Iter. #5: Sun 2021-11-07 08:00:00 CET
(in UTC): Sun 2021-11-07 07:00:00 UTC
From now: 1 week 3 days left
6 E-Mail-Benachrichtigungen bei einem fehlerhaften Zeitgeber #
systemd
bietet keine vergleichbare Funktion wie MAILTO in Cron. Im Folgenden wird eine Behelfslösung beschrieben, mit der E-Mail-Benachrichtigungen aktiviert werden, wenn ein Zeitgeber fehlerhaft ist.
Das Verfahren besteht aus den folgenden Schritten:
Erstellen Sie ein Skript, mit dem eine E-Mail gesendet wird.
Erstellen Sie eine
systemd
-Dienstdatei, mit der das E-Mail-Skript ausgeführt wird.Testen Sie die E-Mail-Dienstdatei.
Rufen Sie vom Dienst aus, der den Zeitgeber steuert, die erstellte E-Mail-Dienstdatei über
OnFailure
auf.
Im folgenden Beispiel wird das Kommando mailx
aus dem Paket mailx verwendet. Dazu muss der Postfix-E-Mail-Server installiert und korrekt konfiguriert sein.
Erstellen Sie das Skript
/usr/local/bin/send_systemd_email
.Das Skript benötigt zwei Parameter:
$1
, die E-Mail-Adresse und$2
, der Name der Dienstdatei, für die die Fehlermeldung eingegangen ist. Beide Parameter werden von der Unit-Datei bereitgestellt, die das Mail-Skript ausführt.#!/bin/sh systemctl status --full "$2" | mailx -S sendwait\ -s "Service failure for $2" -r root@$HOSTNAME $1
Das Skript muss ausführbar sein:
>
sudo
chmod 755 /usr/local/bin/send_systemd_email
Erstellen Sie die Datei
/etc/systemd/system/send_email_to_USER@.service
.[Unit] Description=Send systemd status information by email for %i to USER [Service] Type=oneshot ExecStart=/usr/local/bin/send_systemd_email EMAIL_ADDRESS %i User=root Group=systemd-journal
Ersetzen Sie USER und EMAIL_ADDRESS in der Datei durch die Anmeldedaten und die E-Mail-Adresse des Benutzers, der die E-Mail erhalten soll.
%i
ist der Name des fehlerhaften Dienstes (wird über den Parameter%n
an den E-Mail-Dienst übergeben).Überprüfen Sie die Dienstdatei und beheben Sie die gemeldeten Probleme:
>
systemd-analyze verify /etc/systemd/system/send_email_to_USER@.serviceWenn das Kommando keine Ausgabe zurückgibt, hat die Datei die Überprüfung erfolgreich bestanden.
Soll das gesamte Verfahren geprüft werden, starten Sie den Dienst mit der
dbus
-Instanz zum Testen. (Sie können jeden anderen Dienst verwenden, der aktuell ausgeführt wird. Dieses Beispiel greift auf dbus zurück, da dieser Dienst definitiv auf jeder Installation ausgeführt wird.)>
sudo
systemctl start send_email_to_USER@dbus.serviceBei Erfolg erhält EMAIL_ADDRESS eine E-Mail mit dem Betreff
Service failure for dbus
und dbus-Statusmeldungen im Haupttext. (Dies ist nur ein Test; es liegt kein Problem mit dem dbus-Dienst vor. Sie können die E-Mail beruhigt löschen, da keine Maßnahmen erforderlich sind.)Wenn die Test-E-Mail erfolgreich gesendet wurde, integrieren Sie sie in die Dienstdatei.
Soll dem Dienst eine E-Mail-Benachrichtigung hinzugefügt werden, tragen Sie die Option
OnFailure
in AbschnittUnit
der Dienstdatei ein, für die Sie im Fehlerfall eine Benachrichtigung erhalten möchten:[Unit] Description="Hello World script" OnFailure1=send_email_to_USER2@%n3.service [Service] ExecStart=/usr/local/bin/helloworld.sh
Sie haben die Fehlerbenachrichtigung für systemd
-Dienste erfolgreich eingerichtet.
In der E-Mail-Dienstdatei ist die E-Mail-Adresse des Empfängers hartcodiert. Wenn Sie die Benachrichtigungs-E-Mails an einen anderen Benutzer senden möchten, kopieren Sie die E-Mail-Dienst-Datei und ersetzen Sie die Anmeldedaten des Benutzers im Dateinamen und die E-Mail-Adresse in der Kopie.
Wenn eine Fehlerbenachrichtigung an mehrere Empfänger gleichzeitig gesendet werden soll, fügen Sie die entsprechenden Dienstdateien zur Dienstdatei hinzu (durch Leerzeichen voneinander getrennt):
OnFailure=send_email_to_tux@%n.service send_email_to_wilber@%n.service
7 Verwenden von Zeitgebern als normaler Benutzer #
systemd
-Zeitgeber können auch von normalen Benutzern verwendet werden. So können Sie wiederkehrende Aufträge leichter automatisieren, z. B. die Erstellung von Sicherungskopien, die Bildbearbeitung oder das Verschieben von Daten in die Cloud.
Es gelten die gleichen Verfahren und Aufgaben wie bei systemweiten Zeitgebern. Es gelten jedoch die folgenden Unterschiede:
Zeitgeber- und Dienstdateien müssen in
~/.config/systemd/user/
abgelegt werden.Alle
systemctl
- undjournalctl
-Kommandos müssen mit dem Schalter--user
ausgeführt werden. Beisystemd-analyze
ist diese Option nicht erforderlich.Als normaler Benutzer müssen Sie den Pfad zu den Unit-Dateien angeben, wie in den Beispielen unten dargestellt. Sollte ein systemweiter Zeitgeber mit demselben Namen vorhanden sein, würde ansonsten nur dieser Zeitgeber ausgeführt oder aufgelistet.
>
systemctl --user start ~/.config/systemd/user/helloworld.timer>
systemctl --user enable ~/.config/systemd/user/helloworld.timer>
systemctl --user list-timers>
journalctl --user -u helloworld.*>
systemd-analyze verify ~/.config/systemd/user/helloworld.timer
Wie andere systemd
-Dienste, die als normaler Benutzer gestartet werden, werden Benutzer-Zeitgeber nur dann ausgeführt, wenn der Benutzer angemeldet ist. Um stattdessen die Zeitgeber der Benutzer beim Booten zu starten und nach der Abmeldung weiterlaufen zu lassen, aktivieren Sie die Verweildauer für jeden betroffenen Benutzer:
sudo loginctl enable-linger USER
Weitere Informationen hierzu finden Sie im man 1 loginctl
.
Die systemd
-Benutzerinstanz erbt keine Umgebungsvariablen, die von Skripten wie ~/.profile
oder ~/.bashrc
festgelegt werden. Zum Prüfen der systemd
-Umgebung führen Sie systemctl --user show-environment
aus.
Sollen alle noch fehlenden Variablen in die systemd
-Umgebung importiert werden, fügen Sie das folgende Kommando am Ende der Datei ~/.bashrc
ein:
systemctl --user import-environment VARIABLE1 VARIABLE2
8 Migration von Cron zu systemd
-Zeitgebern #
Alle Cron-Aufträge können zu systemd
-Zeitgebern migriert werden. Eine Anleitung und ein Beispiel finden Sie hier.
Erstellen Sie eine Dienstdatei, die das Skript ausführt. Ausführliche Informationen finden Sie unter Beispiel 1, „Die Dienstdatei“.
Erstellen Sie eine Zeitgeberdatei, die die Dienstdatei ausführt. Allgemeine Anweisungen finden Sie unter Beispiel 2, „Die Zeitgeberdatei“.
Konvertieren Sie die Kalendereinträge. Die Zeit wird im cron-Daemon und in
systemd
unterschiedlich angegeben. Ziehen Sie die Schemas unten als Vorlage für die Konvertierung heran:Cron: Minute Hour Day Month DayOfWeek systemd: OnCalendar=DayOfWeek Year-Month-Day Hour:Minute:Second
Testen Sie den konvertierten Kalendereintrag anhand der Anweisungen in Abschnitt 5, „Testen von Kalendereinträgen“.
Konvertieren Sie die Cron-Kurznamen (
@NICK
):Cron :
systemd
timer -------- : ---------------------------- @reboot : OnBootSec=1s @yearly : OnCalendar=*-01-01 00:00:00 @annually: OnCalendar=*-01-01 00:00:00 @monthly : OnCalendar=*-*-01 00:00:00 @weekly : OnCalendar=Sun *-*-* 00:00:00 @daily : OnCalendar=*-*-* 00:00:00 @hourly : OnCalendar=*-*-* *:00:00Konvertieren Sie die Variablenzuweisungen. Die
systemd
-Variablenzuweisung muss in Abschnitt[Service]
eingetragen werden. Hiermit ist es nicht möglich,MAILTO
zu konvertieren; beachten Sie dazu den nächsten Schritt.cron: VARIABLE=VALUE systemd: Environment="VARIABLE=VALUE"
Richten Sie E-Mail-Benachrichtigungen ein, die die MAILTO-Funktion von Cron ersetzen sollen. Beachten Sie dazu die Anweisungen in Abschnitt 6, „E-Mail-Benachrichtigungen bei einem fehlerhaften Zeitgeber“.
systemd
-Zeitgebern #
Hier sind die crontab-Einträge, die das Skript helloworld.sh
5 Minuten nach dem Booten und jeden Montag bis Freitag um 10 Uhr aufrufen:
@reboot sleep 300 && /usr/local/bin/helloworld.sh 0 10 * * * 1-5 /usr/local/bin/helloworld.sh
Die systemd
-Dienstdatei (helloworld.service
), die das Skript aufruft, sieht wie folgt aus:
[Unit] Description="Hello World script" [Service] ExecStart=/usr/local/bin/helloworld.sh
Die Zeitgeberdatei (helloworld.timer
) sieht wie folgt aus:
[Unit] Description="Run helloworld.service 5min after boot and at 10am every Mon-Fri" [Timer] OnBootSec=5min OnCalendar=Mon..Fri *-*-* 10:00:* Unit=helloworld.service [Install] WantedBy=multi-user.target
9 Fehlersuche und häufig gestellte Fragen #
Erfahren Sie, wie Sie Fehler in systemd
-Zeitgebern, die fehlgeschlagen sind, suchen und beheben. Außerdem erhalten Sie Antworten auf häufig gestellte Fragen zu systemd
-Zeitgebern.
9.1 Fehlervermeidung #
Damit keine Fehler bei systemd
-Zeitgebern auftreten, beachten Sie in jedem Fall diese bewährten Verfahren:
Prüfen Sie, ob die im Dienst mit
ExecStart
angegebene ausführbare Datei ordnungsgemäß läuft.Überprüfen Sie die Syntax der Dienst- und Zeitgeberdateien, indem Sie
systemd-analyze verify FILE
ausführen.Prüfen Sie die Ausführungszeiten der Kalendereinträge mit
systemd-analyze calendar CALENDER_ENTRY
.
9.2 Ereignis wird nicht ausgelöst #
Wenn Sie einen Zeitgeber aktivieren, der nichtkritische Fehler enthält, ignoriert systemd
diese Fehler stillschweigend. Beispiel:
systemd
-Zeitgeber Datei mit einem nichtfatalen Fehler #[Timer] OnBootSec=5min OnClendar=Mon..Fri 10:00 Unit=helloworld.service
Zeile 3 enthält einen Syntaxfehler (OnClendar
anstelle von OnCalendar
). Da der Abschnitt [Timer]
einen zweiten Zeitgeber-Eintrag (OnBoot) enthält, ist der Fehler nicht kritisch und wird stillschweigend ignoriert. Infolgedessen wird der Auslöser für montags bis freitags nicht ausgeführt. Die einzige Möglichkeit, den Fehler zu erkennen, ist das Kommando systemd-analyze verify
:
#
systemd-analyze verify /etc/systemd/system/helloworld.timer
/etc/systemd/system/helloworld.timer:7: Unknown key name 'OnClendar' in section 'Timer', ignoring.
9.3 Prüfen des Systemjournals auf Fehler #
Wie bei jedem systemd
-Dienst werden Ereignisse und Aktionen, die von Zeitgebern ausgelöst werden, im Systemjournal protokolliert. Wenn ein Auslöser sich nicht wie erwartet verhält, prüfen Sie die Protokollmeldungen mit journalctl
. Wenn Sie das Journal nach relevanten Informationen filtern möchten, verwenden Sie den -u
-Schalter, um die systemd
-Zeitgeber und Dienstdateien anzugeben. Mit dieser Option können Sie die Protokolleinträge für den Zeitgeber und die entsprechende Dienstdatei anzeigen:
sudo journalctl -u helloworld.timer -u helloworld.service
oder kürzer (soweit möglich):
sudo journalctl -u helloworld.*
journalctl
ist ein Tool, das viele Optionen und Filter unterstützt. Detaillierte Informationen Informationen hierzu finden Sie unter man 1 journalctl
. Die folgenden Optionen eignen sich für die Fehlerbehebung bei Zeitgebern:
-b
: Zeigt nur Einträge für den aktuellen Bootvorgang.-S today
: Zeigt nur Einträge vom heutigen Tag.-x
: Zeigt Hilfetexte zusätzlich zum Protokolleintrag.-f
: Beginnt mit den neuesten Einträgen und druckt das Protokoll fortlaufend aus, wenn neue Einträge hinzugefügt werden. Damit lassen sich Auslöser prüfen, die in kurzen Zeitabständen erfolgen. Beenden Sie den Vorgang mit Strg–C.
9.4 systemd
-Zeitgeber: Versäumte Ausführungen nachholen #
Wenn ein systemd
-Zeitgeber während der erwarteten Ausführungszeit inaktiv war (wurde oder wenn das System zu dieser Zeit ausgeschaltet war), können versäumte Ereignisse optional sofort ausgelöst werden, sobald der Zeitgeber wieder aktiviert wird. Fügen Sie hierzu die Konfigurationsoption Persistent=true
in den Abschnitt [Timer]
ein:
[Timer] OnCalendar=Mon..Fri 10:00 Persistent=true Unit=helloworld.service
9.5 Migration von Cron zu systemd
-Zeitgebern #
Alle Cron-Aufträge können zu systemd
-Zeitgebern migriert werden. Hier finden Sie allgemeine Anweisungen für die Migration eines Cron-Auftrags:
Erstellen Sie eine Dienstdatei, die das Skript ausführt. Ausführliche Informationen finden Sie unter Beispiel 1, „Die Dienstdatei“.
Erstellen Sie eine Zeitgeberdatei, die die Dienstdatei ausführt. Allgemeine Anweisungen finden Sie unter Beispiel 2, „Die Zeitgeberdatei“.
Konvertieren Sie die Kalendereinträge. Die Zeit wird im cron-Daemon und in
systemd
unterschiedlich angegeben. Ziehen Sie die Schemas unten als Vorlage für die Konvertierung heran:Cron: Minute Hour Day Month DayOfWeek systemd: OnCalendar=DayOfWeek Year-Month-Day Hour:Minute:Second
Testen Sie den konvertierten Kalendereintrag anhand der Anweisungen in Abschnitt 5, „Testen von Kalendereinträgen“.
Konvertieren Sie die Cron-Kurznamen (
@NICK
):Cron :
systemd
timer -------- : ---------------------------- @reboot : OnBootSec=1s @yearly : OnCalendar=*-01-01 00:00:00 @annually: OnCalendar=*-01-01 00:00:00 @monthly : OnCalendar=*-*-01 00:00:00 @weekly : OnCalendar=Sun *-*-* 00:00:00 @daily : OnCalendar=*-*-* 00:00:00 @hourly : OnCalendar=*-*-* *:00:00Konvertieren Sie die Variablenzuweisungen. Die
systemd
-Variablenzuweisung muss in Abschnitt[Service]
eingetragen werden. Hiermit ist es nicht möglich,MAILTO
zu konvertieren; beachten Sie dazu den nächsten Schritt.cron: VARIABLE=VALUE systemd: Environment="VARIABLE=VALUE"
Richten Sie E-Mail-Benachrichtigungen ein, die die MAILTO-Funktion von Cron ersetzen sollen. Beachten Sie dazu die Anweisungen in Abschnitt 6, „E-Mail-Benachrichtigungen bei einem fehlerhaften Zeitgeber“.
systemd
-Zeitgebern #
Hier sind die crontab-Einträge, die das Skript helloworld.sh
5 Minuten nach dem Booten und jeden Montag bis Freitag um 10 Uhr aufrufen:
@reboot sleep 300 && /usr/local/bin/helloworld.sh 0 10 * * * 1-5 /usr/local/bin/helloworld.sh
Die systemd
-Dienstdatei (helloworld.service
), die das Skript aufruft, sieht wie folgt aus:
[Unit] Description="Hello World script" [Service] ExecStart=/usr/local/bin/helloworld.sh
Die Zeitgeberdatei (helloworld.timer
) sieht wie folgt aus:
[Unit] Description="Run helloworld.service 5min after boot and at 10am every Mon-Fri" [Timer] OnBootSec=5min OnCalendar=Mon..Fri *-*-* 10:00:* Unit=helloworld.service [Install] WantedBy=multi-user.target
10 Weitere Informationen #
Eine umfassende Referenz zu
systemd
-Zeitgebern mit erweiterten Konfigurationsoptionen (z. B. Verzögerungen oder die Verarbeitung von Änderungen der Uhrzeit oder der Zeitzone) finden Sie unterman 5 systemd.timer
.
11 Rechtliche Hinweise #
Copyright © 2006–2024 SUSE LLC und Mitwirkende. Alle Rechte vorbehalten.
Es wird die Genehmigung erteilt, dieses Dokument unter den Bedingungen der GNU Free Documentation License, Version 1.2 oder (optional) Version 1.3 zu vervielfältigen, zu verbreiten und/oder zu verändern; die unveränderlichen Abschnitte hierbei sind der Urheberrechtshinweis und die Lizenzbedingungen. Eine Kopie dieser Lizenz (Version 1.2) finden Sie in Abschnitt „GNU Free Documentation License“.
Die SUSE Marken finden Sie im https://www.suse.com/company/legal/. Alle anderen Marken von Drittanbietern sind Besitz ihrer jeweiligen Eigentümer. Markensymbole (®, ™ usw.) kennzeichnen Marken von SUSE und ihren Tochtergesellschaften. Sternchen (*) kennzeichnen Marken von Drittanbietern.
Alle Informationen in diesem Buch wurden mit größter Sorgfalt zusammengestellt. Auch hierdurch kann jedoch keine hundertprozentige Richtigkeit gewährleistet werden. Weder SUSE LLC noch ihre Tochtergesellschaften noch die Autoren noch die Übersetzer können für mögliche Fehler und deren Folgen haftbar gemacht werden.