Meist automatisiert man unter Linux diverse wiederkehrende Aufgaben mit der System-Software Cron, die lässt sich jedoch auch problemlos mit Systemd erledigen. Hierzu nutzt man Units des Typs „.timer„.
So lassen sich etwa zeitgesteuerte Backups und vieles mehr mit Systemd automatisch ausführen. Der Vorteil von mit Systemd-gesteuerten Aufgaben – diese können unter anderem schon während des Starts des Systems durchgeführt werden, oder beim Herunterfahren, …
Zeitgesteuerte Aufgaben mit Systemd anlegen
Zwei Schritte sind notwendig um solche Aufgaben zu erstellen – besser gesagt müssen zwei Dateien angelegt werden:
- Service-Unit – Mit dieser wird dem System gezeigt, was eigentlich ausgeführt werden soll
- Timer-Unit – Mit dieser zeigt man dem System wann die Aufgabe ausgeführt werden soll
Beginnen wir mit der Service-Unit, solche vom Nutzer erstellten Dateien liegen unter „/etc/systemd/user/„, möglich wäre natürlich auch das Unterverzeichnis „/etc/systemd/system/“ – erstellt wird eine solche Datei am einfachsten gleich einmal mit dem Terminal-Editor Nano – natürlich als Administrator:
nano /etc/systemd/user/bezeichnung.service
Ein sehr einfaches Beispiel für eine solche Datei:
[Unit]
Description=System-Backup (Backup des kompletten Systems)
[Service]
ExecStart=/pfad/zum/backup.sh
In diesem Fall würde Systemd die Service-Unit (in diesem Beispiel mit dem Namen „bezeichnung.service„) einfach beim Start des Systems starten – dies könnte den Start des Systems jedoch verlangsamen, deshalb erstellt man sich zusätzlich die Timer-Unit.
Mit Strg+o speichern wir die Datei, bestätigen mit Eingabe und schließen den Editor mit Strg+x. Mit „Description=“ gibt man eine Beschreibung des Services an, mit „ExecStart=“ wird angegeben was gestartet werden soll.
Nun gehen wir weiter zur Timer-Unit – diese hat im selben Verzeichnis zu liegen wie die Service-Unit und hat denselben Namen zu tragen. Da sich in diesem Beispiel die Service-Unit „bezeichnung.service“ nennt wird sich die Timer-Unit „bezeichnung.timer“ nennen:
nano /etc/systemd/user/bezeichnung.timer
[Unit]
Description=System-Backup (Backup des kompletten Systems)
[Timer]
OnCalendar=*-*-* 20:15:00
Persistent=true
RandomizeDelaySec=20m
Unter „Description=“ geben wir wieder dieselbe Beschreibung wie in der Service-Unit an – wichtig ist nun vor allem der Abschnitt „[Timer]“ – mit diesem geben Sie an wann die Aufgabe in der Service-Unit gestartet werden soll. In diesem Beispiel „OnCalendar=*-*-* 20:15:00“ würde die Aufgabe täglich – also bei jedem Systemstart „*-*-*“ um „20:15:00“ ausgeführt werden.
Statt täglich – also „*-*-*“ können Sie auch genauere Angaben machen, hierzu ist folgende Syntax nötig:
Wochentag Jahr-Monat-Tag Stunde:Minute:Sekunde
Ein kleines Beispiel:
Fr 2021-09-30 20:15:00
Die Sternchen ersetzen also die Angabe, wird statt der Angabe des Jahres ein Sternchen „*“ gesetzt wird die Aufgabe jedes Jahr ausgeführt, das zweite Sternchen ersetzt das Monat – die Aufgabe wird jedes Monat ausgeführt und das letzte ersetzt den Tag – also täglich. Das Beispiel oben sollten Sie nicht ganz so ernst nehmen – es dient nur als Beispiel – fällt der 30. nicht auf einen Freitag, wird auch die Aufgabe nicht ausgeführt.
Gibt man eine konkrete Zeit an – wie im Beispiel oben und der Rechner läuft zu dieser Zeit nicht, sogt der Eintrag „Persistent=true“ dafür, dass die Aufgabe beim nächsten Systemstart so schnell wie möglich nachgeholt wird. Beim Systemstart werden jedoch viele Services gleichzeitig gestartet – noch eines mehr würde den Start verlangsamen. Hier sorgt der Eintrag „RandomizeDelaySec=20m“ dafür, dass die Aufgabe 20 Minuten (20m) nach dem Start des Systems ausgeführt wird. Eine Stunde nach dem Start „1h„, 40 Sekunden danach „40s“ und so weiter und so fort.
Neben der Angabe eines konkreten Datums mit Uhrzeit lassen sich Services natürlich auch wiederkehrend ausführen, ein Beispiel, das auf dem oberen aufbaut:
[Unit]
Description=System-Backup (Backup des kompletten Systems)
[Timer]
OnBootSec=5m
Persistent=true
RandomizeDelaySec=20m
Die Angabe „OnBootSec=“ gibt an, dass die Aufgabe 5 Minuten „5m“ nach dem Start auszuführen ist. Dies könnte man noch erweitern – etwa:
[Unit]
Description=System-Backup (Backup des kompletten Systems)
[Timer]
OnBootSec=5m
OnUnitActiveSec=1w
Persistent=true
RandomizeDelaySec=20m
Hier gibt der Eintrag „OnUnitActiveSec=“ an, dass der Service ab dem ersten Start wöchentlich „1w„, oder täglich „1t“ ausgeführt wird.
Auch „OnCalendar=“ können Sie anpassen, so wird mit:
OnCalendar=daily
die Aufgabe täglich ausgeführt, weitere Möglichkeiten wären „weekly„, „minutely“ und „hourly„. Soll die Aufgabe direkt beim Systemstart ausgeführt werden – etwa um ein Programm zu starten, setzen Sie folgenden Code hinzu:
[Install]
WantedBy=timers.target
Für das oberste Beispiel also:
[Unit]
Description=System-Backup (Backup des kompletten Systems)
[Timer]
OnCalendar=*-*-* 20:15:00
Persistent=true
RandomizeDelaySec=20m
[Install]
WantedBy=timers.target
Dieses Beispiel ist natürlich nicht ganz ernst zu nehmen – zuletzt aktivieren Sie nach der Erstellung die Timer-Unit mit dem Befehl:
systemctl enable bezeichnung.timer
Alternativ lässt sich dieser auch manuell starten:
systemctl start bezeichnung.timer
Noch keine Reaktion