Inspiriert durch das Thema von JeyF123 über Probleme mit Cron und den Hinweisen von Sauerland zu systemd-timer als Cron-Alternative, habe ich mich mal an der Überführung einer meiner Cron-Aufgaben nach Systemd versucht.
Die Aufgabenstellung in meiner /etc/crontab für das EInspielen von Patches und Updates:
GNU nano 4.9.2 /etc/crontab
1 SHELL=/bin/bash
2 PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin
3 MAILTO=root
4 #
8 #
9 # Mo, MI, Fri openSUSE-Updates einspielen
10 #
11 0 0 * * 1,3,5 root bash -lc 'Update_OS.rex '
12 #
An drei Tagen (Montag, Mittwoch, Freitag) lasse ich durch cron ein Script laufen, das per zypper alle für mich notwendigen Patches und Updates auf meinem Desktop installiert.
An Hand der Zypper-Returncodes ermittelt das Script auch, ob ein Reboot des Systems erforderlich ist und setzt als letzte Anweisung shutdown -r +30 "Rechner wird in 30 Minuten durchgestartet" ab. Für mich wichtige Informationen schreibt das Script per logger auch in das Journal.
Um diese Aufgabe per systemd zu lösen, hab ich mich an dem Beispiel von Michael Kofler (https://kofler.info/systemd-timer-als-cron-alternative/) orientiert und in /etc/systemd/system die Dateien Update_OS.timer und Update_OS.service angelegt.
[Unit]
Description=Update_OS --timer
Wants=network-online.target
[Timer]
OnCalendar=Mon,Wed,Fri
Persistent=true
Unit=Update_OS.service
[Install]
WantedBy=multi-user.target
Alles anzeigen
[Unit]
Description=Update_OS --service
#
# Automatisches Einspielen von Patches und Updates
# durch zypper, der per REXX-PScript aufgerufen wird
#
Requires=NetworkManager.service NetworkManager-wait-online.service
After=NetworkManager.service
[Service]
Type=oneshot
NotifyAccess=exec
StandardOutput=file:/var/log/Update_OS.log
StandardError=inherit
User=root
Group=root
#Nice=19
#IOSchedulingClass=2
#IOSchedulingPriority=7
ExecStart=/bin/bash -lc '/usr/local/bin/Update_OS.rex '
[Install]
WantedBy=multi-user.target
Alles anzeigen
Da ja im Gegensatz zur Ausführung der Aufgabe mit Cron von Systemd keine E-Mail kommt, lasse ich alle Ausgaben in eine Log-Datei schreiben.
Mit systemctl enable --now Update_OS.timer wird der Timer aktiviert. Durch die Option --now spart man sich die zusätzliche Start-Anweisung.
Beim Start meldet Systemd auch Syntax-Fehler. Ich hab dann mehrfach den Timer wieder disablen müssen, um die Timer- bzw. Service-Datei zu korrigieren. Bis beide Dateien anstandslos von Systemd anerkannt wurden, hab ich reichlich Gebrauch von den entsprechenden Man-Pages per Browser gemacht.
Bei Änderungen am aktiven Timer bzw. Service muß dieser per systemctl reenable --now <timername>.timer oder per systemctl daemon-reload aktualisieren.
Ich hab für die Umstellung von Cron nach Systemd ca. 7-8 Stunden mit Unterbrechungen (genau weiß ich es nicht) benötigt.
Die Umstellung der restlichen Cron-Aufgaben (2 Sicherungsaufgaben mit fsarchiver bzw. BorgBackup) werden als nächstes in Angriff genommen.
Ob die beiden Dateien vom Inhalt her optimal aufgebaut sind, müssen Systemd-Kundige beurteilen, für meine Zwecke reicht das.