5 Minuten Lesezeit (1041 Worte)

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:

[Unit]

[Timer]

[Install] 

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:

  • OnBootSec: Gibt die Zeit nach dem Start des Betriebssystems, ab der die Service-Unit vom Timer gestartet werden soll, in Sekunden an.
  • OnStartupSec: Gibt an, wie viele Sekunden nach dem Start des Systemd-Prozesses die Service-Unit vom Timer gestartet werden sollDies kann bei längeren Systemstarts hilfreich sein.
  • OnCalendar: Gibt einen genauen Zeitpunkt an, zu dem die Service-Unit gestartet werden soll. Dies ist die wohl wichtigste Timer-Direktive.
Zusätzlich gibt es noch weitere ergänzende Timer-Direktiven, die hilfreich sein können:
  • AccuracySec: Gibt die Sekunden an, innerhalb derer die referenzierte Unit spätestens gestartet werden soll. Standardmäßig sind 60 Sekunden eingestellt. In bestimmten Situationen kann dies sehr wichtig sein.
  • Unit: gibt die Unit an, die von dem Timer gestartet werden soll.
  • Persistent: führt die angegebene Service-Unit nachträglich aus, sollte die angegebene Zeit verpasst worden sein. Dies könnte vorkommen, wenn das Gerät zu der angegebenen Zeit ausgeschaltet ist.

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:

[Unit] 
Description=Grundstruktur der meisten Timer Units 

[Timer] 

[Install] 
WantedBy=timer.target  

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.

[Timer] 
OnBootSec=120 
Unit=anderer_service.service  

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

[Timer] 
OnStartupSec=60s 
AccuracySec=5s  

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

  • Mikrosekunden: usec, us, μs
  • Millisekunden: msec, ms
  • Sekunden: seconds, second, sec, s
  • Minuten: minutes, minute, min, m
  • Stunden: hours, hour, hr, h
  • Tage: days, day, d
  • Wochen: weeks, week, w
  • Monate: months, month, M (definiert als 30.44 Tage)
  • Jahre: years, year, y (definiert als 365.25 Tage)

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:

[Timer]
OnCalendar=*-*-* 08:00:00 
Persistent=true  

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:

  • minutely entspricht *-*-* *:*:00 und findet jede Minute statt
  • hourly entspricht *-*-* *:00:00 und findet jede Stunde statt
  • daily entspricht *-*-* 00:00:00 und findet jeden Tag statt
  • monthly entspricht *-*-01 00:00:00 und findet jeden Monat statt
  • weekly entspricht Mon *-*-* 00:00:00 und findet jede Woche statt
  • yearly entspricht *-01-01 00:00:00 und findet jedes Jahr statt
  • quarterly entspricht *-01, 04, 07, 10-01 00:00:00 und findet jedes Quartal statt
  • semiannually entspricht *-01, 07-01 00:00:00 und findet jedes Halbjahr statt

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.

 

Kommentare

Derzeit gibt es keine Kommentare. Schreibe den ersten Kommentar!
Dienstag, 25. Juni 2024

Sicherheitscode (Captcha)

×
Informiert bleiben!

Bei Updates im Blog, informieren wir per E-Mail.

Weitere Artikel in der Kategorie