systemd.timer
Als Alternative zum “well known crontab” stellt sich systemd.timer als gut beherrschbar und stark erweiterbare Lösung dar. Ich möchte hier eine kurze Erläuterung liefern und anhand eines Bespiels beschreiben wie sich die Nutzung von systemd.timer gestalten kann. In dem folgenden Fall wird ein Timer zum synchronisieren eines GitLab-Repositorys genutzt.
Als erstes wird das auszuführende shell-Script erstellt
> mkdir -p /opt/scripts
> nano /opt/scripts/hugo-ci.sh
Als Inhalt des Scripts wird das GitLab-Repository gepullt, sowie die Rechte des Webserver-Verzeichnis angepasst
#!/bin/sh
set -xe
cd /var/www/html
git pull
chown -R www-data:www-data /var/www/html
exit
Wichtig für die erfolgreiche Ausführung des Scripts ist das ausführbarmachen mittels
> chmod +x /opt/scripts/hugo-ci.sh
Für die Umsetzung sind zwei systemd-Units zu erstellen.
Angefangen wird mit dem eigentlichen Service unter /usr/lib/systemd/system/hugo-ci.service
[Unit]
Description=CI Pipeline for goHugo
[Service]
Type=simple
ExecStart=/opt/scripts/hugo-ci.sh
[Install]
WantedBy=multi-user.target
Im Anschluss wird der Timer unter /usr/lib/systemd/system/hugo-ci.timer
erstellt.
Der zuvor erstellte Service wird unter stündlich ausgeführt, gesteuert wird dies unter OnCalendar
[Unit]
Description=Pull goHugo CI every hour
[Timer]
OnCalendar=*-*-* *:00:00
Unit=hugo-ci.service
[Install]
WantedBy=multi-user.target
Nachdem der Service zum ausführen des Scripts, sowie der gleichnamige Timer erstellt wurden, wird dieser zum ausführen des Services enabled und gestartet
> systemctl enable hugo-ci.timer
> systemctl start hugo-ci.timer
Die Überprüfung ob der Timer enabled und aktiv ist, wird wie folgt vorgenommen
> systemctl is-enabled hugo-ci.timer
> systemctl is-active hugo-ci.timer
Um die Funktion des Service zu testen, kann dieser direkt ausgeführt werden
> systemctl start hugo-ci
Falls nachträglich Änderungen des Timers vorgenommen werden, ist ein Reload des systemd-Daemons erforderlich
> systemctl daemon-reload
Um anzeigen zu lassen wieviel Zeit bis zum nächsten Auslösen verbleibt, dient folgender Befehl
> systemctl list-timers hugo-ci.timer
--
NEXT LEFT LAST PASSED UNIT ACTIVATES
Sat 2019-05-25 23:00:00 CEST 12min left Sat 2019-05-25 22:00:15 CEST 47min ago hugo-ci.timer hugo-ci.service
---
Im Folgenden eine Auflistung der möglichen Timer
Minimal form Normalized form
Sat,Thu,Mon-Wed,Sat-Sun ==> Mon-Thu,Sat,Sun *-*-* 00:00:00
Mon,Sun 12-*-* 2,1:23 ==> Mon,Sun 2012-*-* 01,02:23:00
Wed *-1 ==> Wed *-*-01 00:00:00
Wed-Wed,Wed *-1 ==> Wed *-*-01 00:00:00
Wed, 17:48 ==> Wed *-*-* 17:48:00
Wed-Sat,Tue 12-10-15 1:2:3 ==> Tue-Sat 2012-10-15 01:02:03
*-*-7 0:0:0 ==> *-*-07 00:00:00
10-15 ==> *-10-15 00:00:00
monday *-12-* 17:00 ==> Mon *-12-* 17:00:00
Mon,Fri *-*-3,1,2 *:30:45 ==> Mon,Fri *-*-01,02,03 *:30:45
12,14,13,12:20,10,30 ==> *-*-* 12,13,14:10,20,30:00
mon,fri *-1/2-1,3 *:30:45 ==> Mon,Fri *-01/2-01,03 *:30:45
03-05 08:05:40 ==> *-03-05 08:05:40
08:05:40 ==> *-*-* 08:05:40
05:40 ==> *-*-* 05:40:00
Sat,Sun 12-05 08:05:40 ==> Sat,Sun *-12-05 08:05:40
Sat,Sun 08:05:40 ==> Sat,Sun *-*-* 08:05:40
2003-03-05 05:40 ==> 2003-03-05 05:40:00
2003-03-05 ==> 2003-03-05 00:00:00
03-05 ==> *-03-05 00:00:00
hourly ==> *-*-* *:00:00
daily ==> *-*-* 00:00:00
monthly ==> *-*-01 00:00:00
weekly ==> Mon *-*-* 00:00:00
*:20/15 ==> *-*-* *:20/15:00