Zum Inhalt springenZur Seitennavigation springen: vorherige Seite [Zugriffstaste p]/nächste Seite [Zugriffstaste n]
documentation.suse.com / Arbeiten mit systemd-Zeitgebern

Arbeiten mit systemd-Zeitgebern

Veröffentlicht: 12.11.2024
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 der systemd-Zeitgeber vollständig vertraut zu machen.

ANFORDERUNGEN

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 normale systemd-Dienste behandelt und können daher mit systemctl 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

  1. 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, die systemd mitteilt, welche Anwendung ausgeführt werden soll.

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

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

  4. Starten Sie den Zeitgeber:

    > sudo systemctl start helloworld.timer

    Aktiviert den Zeitgeber nur für die aktuelle Sitzung.

  5. Aktivieren Sie den Zeitgeber, damit er beim Booten definitiv aktiviert wird:

    > sudo systemctl enable helloworld.timer

2.2 Erläuterung des Beispiels

Beispiel 1: Die Dienstdatei
[Unit]
Description="Hello World script"1

[Service]
ExecStart=/usr/local/bin/helloworld.sh2

1

Eine kurze Beschreibung, in der der Zweck der Dienstdatei erläutert wird.

2

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.

Beispiel 2: Die Zeitgeberdatei
[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

1

Eine kurze Beschreibung, in der der Zweck der Zeitgeberdatei erläutert wird.

2

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.

3

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.

4

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.

5

Die auszuführende Dienstdatei.

6

Das systemd-Target, in dem der Zeitgeber aktiviert wird. Weitere Informationen zu systemd-Targets finden Sie in Managing systemd targets with systemctl.

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.timer
Beispiel 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".7

1

Der Dateiname und die Beschreibung des Zeitgebers.

2

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.

3

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

4

Datum und Uhrzeit der nächsten Auslösung des Zeitgebers.

5

Name der Dienstdatei, die der Zeitgeber auslöst.

6

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

7

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 --allPATTERN

PATTERN muss ein Name oder ein Shell-Globbing-Ausdruck sein. Die Operatoren *, ? und [] können verwendet werden. Weitere Informationen zu Globbing-Schemas finden Sie in man 7 glob.

Zeitgeber auflisten, die einen bestimmten Status aufweisen:
> sudo systemctl list-timers --state=STATE

STATE kann folgende Werte annehmen: active, failed, load, sub. Ausführliche Informationen finden Sie unter man systemctl.

Beispiel 4: Auflisten von Zeitgebern

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

1

Der Zeitpunkt, zu dem der Zeitgeber das nächste Mal ausgeführt wird.

2

Die verbleibende Zeit bis zur nächsten Ausführung des Zeitgebers.

3

Der Zeitpunkt, zu dem der Zeitgeber das letzte Mal ausgeführt wurde.

4

Der Zeitraum, der seit der letzten Ausführung des Zeitgebers vergangen ist.

5

Der Name der Zeitgeber-Unit.

6

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

1

Wochentag. Mögliche Werte sind Sun, Mon, Tue, Wed, Thu, Fri, Sat. Lassen Sie diese Option aus, wenn der Wochentag ignoriert werden soll.

2

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.

3

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-Aktivierung

    OnActiveSec=50minutes
  • OnBootSec: Zeit nach dem Booten des Systems

    OnBootSec=10hours
  • OnStartupSec: Zeit nach dem Starten des Dienstmanagers. Bei Systemdiensten ist dies nahezu mit OnActiveSec 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 Dienstes

    OnUnitActiveSec=10seconds
  • OnUnitInactiveSec: Zeit nach der letzten Deaktivierung des entsprechenden Dienstes

    OnUnitInactiveSec=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.sh

Wenn 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_BR

Vorü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:

  1. Erstellen Sie ein Skript, mit dem eine E-Mail gesendet wird.

  2. Erstellen Sie eine systemd-Dienstdatei, mit der das E-Mail-Skript ausgeführt wird.

  3. Testen Sie die E-Mail-Dienstdatei.

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

  1. Erstellen Sie das Skript /usr/local/bin/send_systemd_email.

    1. 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
    2. Das Skript muss ausführbar sein:

      > sudo chmod 755 /usr/local/bin/send_systemd_email
  2. 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).

  3. Überprüfen Sie die Dienstdatei und beheben Sie die gemeldeten Probleme:

    > systemd-analyze verify /etc/systemd/system/send_email_to_USER@.service

    Wenn das Kommando keine Ausgabe zurückgibt, hat die Datei die Überprüfung erfolgreich bestanden.

  4. 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.service

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

  5. Soll dem Dienst eine E-Mail-Benachrichtigung hinzugefügt werden, tragen Sie die Option OnFailure in Abschnitt Unit 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

    1

    Die Option OnFailure verwendet den Dienst als Argument.

    2

    Ersetzen Sie den Teil mit dem Namen der Unit-Dienstdatei durch den Anmeldenamen.

    3

    Gibt den Namen des Dienstes an (in diesem Beispiel helloworld). Dieser Name ist in der E-Mail-Dienstdatei als %i verfügbar.

  6. Sie haben die Fehlerbenachrichtigung für systemd-Dienste erfolgreich eingerichtet.

Tipp
Tipp: Senden von E-Mail-Benachrichtigungen an mehrere Benutzer

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- und journalctl-Kommandos müssen mit dem Schalter --user ausgeführt werden. Bei systemd-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
Wichtig
Wichtig: Benutzer-Zeitgeber werden nur in einer aktiven Sitzung ausgeführt

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.

Wichtig
Wichtig: Umgebungsvariablen werden nicht geerbt

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.

  1. Erstellen Sie eine Dienstdatei, die das Skript ausführt. Ausführliche Informationen finden Sie unter Beispiel 1, „Die Dienstdatei“.

  2. Erstellen Sie eine Zeitgeberdatei, die die Dienstdatei ausführt. Allgemeine Anweisungen finden Sie unter Beispiel 2, „Die Zeitgeberdatei“.

    1. Konvertieren Sie die Kalendereinträge. Die Zeit wird im cron-Daemon und in systemdunterschiedlich 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“.

    2. 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:00
    3. Konvertieren 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"
    4. 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“.

Beispiel 6: Migration von Cron zu 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:

Beispiel 7: Ausschnitt aus einer 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 StrgC.

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:

  1. Erstellen Sie eine Dienstdatei, die das Skript ausführt. Ausführliche Informationen finden Sie unter Beispiel 1, „Die Dienstdatei“.

  2. Erstellen Sie eine Zeitgeberdatei, die die Dienstdatei ausführt. Allgemeine Anweisungen finden Sie unter Beispiel 2, „Die Zeitgeberdatei“.

    1. Konvertieren Sie die Kalendereinträge. Die Zeit wird im cron-Daemon und in systemdunterschiedlich 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“.

    2. 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:00
    3. Konvertieren 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"
    4. 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“.

Beispiel 8: Migration von Cron zu 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