Von Julian Seibel auf Montag, 10. Juni 2024
Kategorie: System Integration

Automatisierte Ausführung von Aufgaben zu einer festen Zeit – Timer in Systemd

​Wäre es nicht schön, wenn Programme und Shell-Skripte von allein starten würden? Ohne einen Klick und zu einem Zeitpunkt, den man sich selbst aussuchen kann? Genau das geht unter Linux mit Systemd Timern.

Was Timer sind und wie man diese verwendet, erfahren Sie im folgenden Blogbeitrag.

Was sind Systemd Timer?

​Systemd Timer bieten die Möglichkeit, Systemd Services zu einem selbst festgelegten Zeitpunkt automatisch zu starten. Die Services können dann wie gewohnt genutzt werden, um Shell-Skripte auszuführen oder Programme zu starten.

Sowohl Systemd Timer als auch Systemd Services gehören zu den sogenannten Systemd Units. Units sind Module, die von Systemd ausgeführt werden und untereinander interagieren können. In diesem Blogartikel wird eine Timer-Unit erstellt, um eine Service-Unit zu einem bestimmten Zeitpunkt zu starten. Diese könnte wiederum ein Shell-Skript aufrufen.

Wie erstellt man einen Systemd Timer?

​Benutzerdefinierte Systemd Timer und Services sind Dateien, die standardmäßig im Ordner /etc/systemd/system gespeichert werden.

Eine Timer-Unit kann erstellt werden, indem im Ordner /etc/systemd/system/ als root eine neue Datei mit der Endung .timer angelegt wird. Alle Timer Units haben einen ähnlichen Aufbau.

Grundgerüst einer Timer Unit:

Der [Timer] Abschnitt ist ausschließlich in den Timer Units verwendbar, während die beiden anderen Abschnitte in allen Units vorkommen können.

Im [Unit] Teil können Metadaten und die Beziehungen zu anderen Systemd Units mit sogenannten Direktiven hinterlegt werden. Es ist immer empfehlenswert, eine Beschreibung mit der Direktive Description hinzuzufügen.

Im [Install] Teil kann unter anderem eingestellt werden, dass die Timer Unit beim Start des Betriebssystems aktiviert wird. Denn nur wenn die Timer Unit aktiv ist, kann sie auch zu einer bestimmten Zeit eine Service-Unit starten. Hierzu wird die Direktive WantedBy verwendet. Als Wert der Direktive wird meist timers.target verwendet. Hierdurch aktiviert Systemd automatisch die Timer Unit beim Start des Betriebssystems.

Im [Timer] Teil kann durch Direktiven eingestellt werden, wann die entsprechende Service-Unit gestartet werden soll. Die wichtigsten Direktiven hierfür sind:

Zusätzlich gibt es noch weitere ergänzende Timer-Direktiven, die hilfreich sein können:

Timer Units in der Praxis

Wie können die oben genannten Direktiven im Detail verwendet werden? Zunächst ist es wichtig zu wissen, dass jede Direktive direkt unter dem Abschnitt eingefügt werden muss, zu dem sie gehört.

In der Praxis sieht die Grundstruktur einer Timer-Unit mit Direktiven wie folgt aus:

Für den [Timer] Teil sind nachfolgend einige Beispiele für die Anwendung aller genannten Direktiven aufgeführt.

Im folgenden Beispiel wird der Service anderer.service zwischen 120 und 180 Sekunden nach dem Systemstart ausgeführt. Die Zeitdifferenz ergibt sich aus der voreingestellten Zeit von 60 Sekunden, in der der Dienst gestartet wird.

Im nachfolgenden Beispiel wird ein Service zwischen 60 und 65 Sekunden nach dem Start von Systemd ausgeführt: 

 Bei der Angabe von Zeitspannen bei Direktiven werden folgende Einheiten akzeptiert:

Hierbei ist die kleinste akzeptierte Zeitspanne eine Mikrosekunde: 1us.

Wenn keine Einheit angegeben wird, geht Systemd meist von Sekunden aus. Es ist jedoch sehr empfehlenswert, stets eine Einheit anzugeben.

Systemd Timer bieten auch die Möglichkeit, mehrere Zeiteinheiten miteinander zu kombinieren. Dazu sollte zuerst die größere Einheit angegeben werden und dann, nach einem Leerzeichen, die kleinere Einheit. Folgendes Beispiel ist möglich:

OnStartupSec=1d 20h 20m 60s

Aus Gründen der Übersichtlichkeit und Verständlichkeit wird im Folgenden nicht mehr explizit auf den Zeitraum von 60 Sekunden hingewiesen, innerhalb dessen die Service-Unit starten kann.

Im folgenden Beispiel wird ein Service täglich um 8 Uhr gestartet. Sollte zu diesem Zeitpunkt das System heruntergefahren sein, wird der Service nachträglich gestartet, sobald das System wieder online ist:

​Die Syntax für das Einstellen des Zeitpunkts ist wie ein Datum aufgebaut. Sämtliche Angaben werden zunächst als Zahlen erwartet:

Jahr-Monat-Tag Stunde:Minute:Sekunde

Wenn ein Teil des Zeitpunkts beliebig sein soll, kann anstelle einer konkreten Zahl ein Sternchen eingefügt werden.

Zusätzlich zu diesem Format können die Wochentage anhand des Namens angegeben werden. Hierbei werden die englischen Abkürzungen verwendet: Mon, Tue, Wed, Thu, Fri, Sat, Sun. Die Kürzel können dann als Zusatz vor dem Zeitpunkt angegeben werden. So wird nachfolgend beispielsweise ein Service jeden Montag um 8 Uhr aufgerufen:

OnCalendar=Mon *-*-* 08:00:00

Um das Einstellen des Zeitpunktes zu erleichtern, stellt Systemd einige Kurzeinstellungen zur Verfügung:

Fazit

​Systemd Timer bieten viele verschiedene Möglichkeiten, Systemd Services und damit Shell-Skripte oder Programme automatisch zu einer bestimmten Zeit starten zu lassen. Auf den ersten Blick erscheinen Timer sehr kompliziert. Auf den zweiten Blick lässt sich jedoch eine klare Struktur erkennen, die mit einer guten Dokumentation und etwas Übung relativ schnell erlernt werden kann.

Quellen

Seminarempfehlung

Kommentare hinterlassen