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:
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 soll. Dies 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.
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:
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:
- 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:
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 statthourly
entspricht*-*-* *:00:00
und findet jede Stunde stattdaily
entspricht*-*-* 00:00:00
und findet jeden Tag stattmonthly
entspricht*-*-01 00:00:00
und findet jeden Monat stattweekly
entsprichtMon *-*-* 00:00:00
und findet jede Woche stattyearly
entspricht*-01-01 00:00:00
und findet jedes Jahr stattquarterly
entspricht*-01, 04, 07, 10-01 00:00:00
und findet jedes Quartal stattsemiannually
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.
Quellen
Seminarempfehlung
LINUX SYSTEMADMINISTRATION GRUNDLAGEN BS-02
Mehr erfahren