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