systemd/Timer Units

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:


Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

  1. Ein Terminal öffnen

  2. Root-Rechte erlangen

  3. einen Editor öffnen

Inhaltsverzeichnis
  1. Installation
  2. Benutzung
    1. Zeitangaben
    2. verpasste Timer nachholen
    3. Timer Units aktivieren
    4. at Ersatz
    5. Genauigkeit
    6. Timer anzeigen
  3. Links

systemd bietet die Möglichkeit, Timer Units zu erstellen. In einer Timer Unit kann hinterlegt werden, dass eine Service Unit zu einem bestimmten Zeitpunkt ausgeführt wird.

Timer Units können also Aufgaben übernehmen, welche traditionell von Cron ausgeführt werden. Aber Timer Units können nicht nur Befehle zu einem festen Zeitpunkt ausführen (z.B. "um Mitternacht"), sondern auch relativ zum Systemstart (z.B. "5 Minuten später").

Installation

Da systemd ab Ubuntu 15.04 integraler Bestandteil des Systems ist (und dieses ohne systemd nicht lauffähig ist), sind alle benötigten Komponenten bereits installiert.

Benutzung

Timer Units werden als einfache Textdateien angelegt[2], mit einer Syntax und einem Aufbau ähnlich INI-Dateien. Der Dateiname kann frei gewählt werden, muss aber auf .timer enden. Selbsterstellte Timer werden im Verzeichnis /etc/systemd/system abgespeichert, wozu Root-Rechte[3] erforderlich sind.

Eine Timer Unit hat z.B. folgenden Aufbau:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[Unit]
Description=Eine kurze Beschreibung des Timers

[Timer]
OnBootSec=2min
OnUnitActiveSec=5min
Unit=name_der_zu_startenden_unit.service

[Install]
WantedBy=multi-user.target

Es gibt drei Sektionen:

Die Bedeutung der Sektionen "[Unit]" und "[Install]" ist identisch mit der von Service Units. Die Sektion "[Timer]" enthält dabei die Informationen, wann die im Schlüssel Unit hinterlegte Unit ausgeführt werden soll.

Im obigen Beispiel würde die Unit namens name_der_zu_startenden_unit.service wie folgt ausgeführt:

Timer Units kennen fünf verschiedene Schlüssel für relative Ausführungszeitpunkte:

Schlüssel Erklärung
OnActiveSec relative Zeit bezogen auf den Zeitpunkt, als die Timer Unit zuletzt aktiviert wurde
OnBootSec relative Zeit bezogen auf den Zeitpunkt, als der Rechner gestartet wurde
OnStartupSec relative Zeit bezogen auf den Zeitpunkt, als systemd gestartet wurde
OnUnitActiveSec relative Zeit bezogen auf den Zeitpunkt, als die Service Unit zuletzt aktiviert wurde
OnUnitInactiveSec relative Zeit bezogen auf den Zeitpunkt, als die Service Unit zuletzt deaktiviert wurde

Außerdem kennen Timer Units noch absolute Zeitangaben. Diese werden im Schlüssel OnCalendar angeben. So würde z.B. die folgende Timer Unit:

1
2
3
4
5
6
7
8
9
[Unit]
Description=Eine kurze Beschreibung des Timers

[Timer]
OnCalendar=Mon-Fri *-*-* 12:00:00
Unit=name_der_zu_startenden_unit.service

[Install]
WantedBy=multi-user.target

die Service Unit name_der_zu_startenden_unit.service an jedem Tag von Montag bis Freitag um 12 Uhr ausführen.

Zeitangaben

Die Timer von systemd kennen eine Vielzahl von Zeiteinheiten. Die kleinste Zeiteinheit sind Mikrosekunden, die größte Jahre. Eine komplette Übersicht inklusive der Einheiten ist in der Dokumentation 🇬🇧 von systemd zu finden.

Für die Werte des OnCalendar Schlüssel kennt systemd eine flexible Syntax zur Zeitangabe. So steht z.B. der Wert Thu,Fri 2016-*-1,5 11:12:13 für:

Eine vollständige Übersicht inklusive vieler Beispiele findet man in der Dokumentation 🇬🇧 von systemd.

verpasste Timer nachholen

Möchte man eine Timer Unit auch noch nachträglich ausführen lassen, also z.B. falls der Rechner zum Zeitpunkt der Fälligkeit des Timers ausgeschaltet war, muss man im Abschnitt [Timer] zusätzlich die Direktive

Persistent=true

setzen. Die Voreinstellung von systemd ist hier false, d.h. verpasste Timer werden nicht nachgeholt. Die Direktive funktioniert nur in Kombination mit der OnCalendar Direktive, nicht mit anderen Direktiven für Zeitpunkte.

Timer Units aktivieren

Nach dem Erstellen müssen Timer Units noch aktiviert und gestartet werden[1]:

sudo systemctl enable name_des_timers.timer
sudo systemctl start name_des_timers.timer 

at Ersatz

Neben den Aufgaben, die traditionell Cron erledigt, kann systemd auch die typische Aufgabe von at übernehmen, einen Job nur ein einziges mal zu einem bestimmten Zeitpunkt zu starten. Es muss kein Script angelegt werden, sondern es genügt das Abschicken eines Befehls im Terminal. Beispiel:

# als root
sudo systemd-run --on-calendar="2022-01-30 20:01:35" touch /tmp/testfile
# als normaler User
systemd-run --user --on-calendar="2022-01-30 20:01:35" touch ~/testfile 

Genauigkeit

Per Voreinstellung haben die Timer eine Genauigkeit von einer Minute, d.h aller spätestens eine Minute nach der in der .timer Datei angegebenen Zeit wird die vom Timer aufgerufene Service Unit aufgerufen.

Wer für einzelne Timer Units einen genaueren Ausführungszeitraum braucht, der kann in der Sektion "[Timer]" zusätzlich den Schlüssel AccuracySec angeben, gefolgt von einer Zeitangabe. So würde z.B. AccuracySec=5s die Genauigkeit auf 5 Sekunden setzen.

Wer eine höhere Genauigkeit für alle Timer systemweit benötigt, der hinterlegt den gewünschten Wert in der Konfigurationsdatei /etc/systemd/system.conf.

Aufgrund dieser Tatsache kann nicht eindeutig die verbleibende Zeit bis zum Trigger ermittelt werden. Dieser Umstand wird im unix.stackexchange ausführlich beschrieben. Darüber hinaus gibt es noch die Möglichkeit mit RandomizedDelaySec eine absichtliche gleichverteilt zufällige Verzögerung zu erzeugen.

Timer anzeigen

Man kann sich alle aktiven Timer mit Hilfe von systemctl wie folgt anzeigen lassen:

systemctl list-timers 

Möchte man zusätzlich die inaktiven Timer sehen, muss man dem Befehl noch die Option --all hinzufügen.