c't 20/2016
S. 190
Praxis
Automatisieren mit Systemd-Timern

The Times They Are A Changin’

(Un)regelmäßige Aufgaben mit Systemd planen

Das Automatisieren von Aufgaben unter Linux ist üblicherweise der Job der Daemons Cron und At. Die Timer von Systemd können beide ersetzen und komplexere Aufgabenstellungen mit Bordmitteln lösen.

Der System- und Sitzungsmanager Systemd hat sich bei allen Mainstream-Distributionen etabliert. Einst als Init-System entwickelt, ist Systemd inzwischen weit mehr als nur ein Dienst, der den Systemstart koordiniert. Eine interessante Fähigkeit von Systemd ist es, mit Hilfe von Timer-Units Dienste zu festgelegten Zeiten zu starten. Die Timer können flexibler als Cron und At auf Ereignisse wie Neustarts reagieren und nutzen die Infrastruktur von Systemd, um Aufgaben effizient und koordiniert auszuführen. Mit ihnen lassen sich auch Aufgaben erledigen, die bisher eine Kombination von Cron und einem weiteren Shell-Skript erforderten. Systemd [1] weiß recht genau, in welchem Zustand sich das System gerade befindet und kann das Abarbeiten von Aufgaben präzise koordinieren. Gleich vorweg: Das Anlegen eines Timers macht mehr Arbeit als das Eintragen einer einzelnen Zeile in die Crontab. Wer also nur eben schnell ein Skript regelmäßig ausführen will, ist mit Cron oftmals besser bedient. Es spricht aber nichts dagegen, beide zu benutzen.

Die Timer können zum Beispiel auf den Start anderer Dienste warten, ohne dass externe Tools prüfen müssen, ob diese Dienste bereits aktiv sind. Dann wartet beispielsweise das automatische Datenbank-Backup, bis die Datenbank auch wirklich läuft. Auch das schlichte Ausführen von Aufgaben im Sekundentakt bedarf keiner Sleep-Verkettungen mehr. Oder man lässt den Trim-Wartungsvorgang für die SSD zehn Minuten nach jedem Boot-Vorgang und anschließend regelmäßig alle siebe Tage starten.

Das Debuggen vereinfacht sich, da man die Aufgaben in einer definierten Shell-Umgebung startet und ihre Ausgaben gesammelt im Journal [2] landen, der zentralen Protokollfunktion von Systemd. Per Timer ausgeführte Aufgaben lassen sich auch einer Control Group (cgroup) zuweisen, um den Verbrauch von Rechenzeit, Arbeitsspeicher und anderen Systemressourcen zu begrenzen. Die Timer können den Rechner zur Ausführung der Aufgabe sogar aus dem Standby aufwecken. Timer können auch nicht nur systemweit, sondern auch auf User-Ebene arbeiten. Was Systemd allerdings nicht von Haus aus bewältigt, ist das Versenden von E-Mails im Fall eines Fehlers, wie man es von Cron typischerweise kennt.

Units …

Systemd-Timer werden, wie andere von Systemd erledigte Aufgaben, über Unit-Files konfiguriert. Ein Timer kann nur Service Units ausführen, das heißt: Wenn das auszuführende Programm keine Unit mitbringt, müssen Sie eine schreiben. Units sind simple Textdateien und erinnern im Format stark an .ini-Dateien unter Windows. Selbstgeschriebene Units gehören in /etc/systemd/system/ etwa als simplebackup.service. Vom System mitgelieferte Units finden sich in /lib/systemd/system/. Eine simple Service-Unit sieht folgendermaßen aus: