Heute, Januar 2016, glauben noch mache, dass openSUSE keine systemd.timer könne.
Das ist falsch.
Es wurden lediglich noch nicht alle Services implementiert, die regelmäßig laufen sollen.
systemd Timer kann man jederzeit verwenden.
Es braucht dazu drei Dinge:
- Ein ausführbares Etwas.
- Ein systemd.service File für dieses ausführbare Etwas
- Ein systemd.timer File für diesen systemd.service für das ausführbare Etwas.
Das sei hier exemplarisch gezeigt anhand eines ganz schlichten Shellscriptes.
Das Shellscript schreibt lediglich das aktuelle Datum in eine Datei:
#!/bin/bash
# zulässig ist alles, was ausführbar ist.
# MERKE: IMMER absolute Pfade verwenden!!!!
# UND IMMER auf JEDE Ausgabe verzichten, ODER in eine Datei umleiten.
# Unsere Scripte haben KEIN Terminal, auf das sie ausgeben könnten!
# das dumme Script:
date "+%Y-%m-%d %H:%M" || : >> /var/log/stupid_timer.txt
Alles anzeigen
( der date Befehl wird verkettet mit . Falls er also fehlschlägt, wird : die NOP Anweisung ausgeführt. Damit muss man STERR nicht umleiten. Es ist sichergestellt, dass im Fehlerfalle dann die NoOPeration ausgeführt wird, die immer erfolgreich ist. Man hätte auch einfach stattdessen STDERR nach null umleiten können: 2>/dev/null)
Dieses selten dämliche Script nennen wir im systemd Jargon den "Service".
Und dafür brauchen wir nun ein Servicefile und ein Timerfile.
Leider sind die Manpages bei openSUSE nicht vollständig. Es gibt sie nur für: systemd-system.conf(5), locale.conf(5), systemctl(1), journalctl(1), systemd-notify(1), daemon(7), sd-daemon(3), systemd.unit(5), systemd.special(5), pkg-config(1), kernel-command- line(7), bootup(7), systemd.directives(7)
(die Zahlen in Klammern geben die jeweiligen Kapitel/Sections in den Manpages an. ein (7) wäre also z.B. mit man 7 systemd.directives aufzurufen.)
Bessere Doku findet sich bei Freedesktop
Im Prinzip sind Servicefiles nichts anderes als die alten LSB (LinuxSandardBase) gemäßen init.d Scripte: Die haben ein paar Beschreibungen, die später angezeigt werden, sagen, in welchem Runlevel es laufen soll und dergleichen mehr. Kurz eine Konfigurationsdatei.
Für unseren tumben Service ist es schlicht das hier:
[Unit]
Description=Mein erster dummer Timerjob
[Service]
# Der Typ simple ist wichtig, es soll nur der Timer
# das Zeuchs ausführen. Siehe Freedesktop Doku für mehr.
Type=simple
# Was soll er von wo aufrufen
# Nach guter Sitte, legen wir unser doofes Script nach:
ExecStart=/usr/local/bin/stupid_timer
# viele Beispiele haben die folgende Section.
# Sie führt nur zu Fehlermeldungen und mag evtl. auf manchen Distris gar nicht funktinieren.
# Also WEGLASSEN!!!!
# Das erledigen wir mit dem Timerfile!!! Dort gehört das hin!!!!
#[Install]
#WantedBy=multi-user.target
Alles anzeigen
Der Platz für dieses Conf- File ist am besten /etc/systemd/{system|user}, je nachdem, wie der Service das braucht. Wir nehmen /etc/systemd/system.
Und wir benennen das, wie es sich gehört:
/etc/systemd/system/stupid_timer.service Er Name ist frei wählbar, die Extension .service nicht.
(Ich bin mir nicht sicher, ob man auch andere namen.Extension verwenden kann, ich denke es ist nur eine Konvention. Habe das aber gar nicht ausprobiert, da ja solche Konventionen die Sache einfacher les- und nachvollziehbar machen.)
Haben wir dort das obige Script und in /user/local/bin unseren "Service", also das billige Shellscript, könnten wir den Service schon einmal testen:
# Weil wir keine [install] section haben, führt das hier zu einem Fehler:
systemctl enable stupid_timer.service
# aber wir können ihn laufen lassen:
systemctl start stupid_timer.service
Damit nun systemd für uns das doofe Script periodisch ausführt, brauchen wir lediglich ein .timer file.
Das speichern wir ebenfalls in /etc/systemd/system (oder halt in user....)
[Unit]
Description=Dies ist mein erster dummer Timer
[Timer]
# Die Syntax für die Zeitangaben sind ähnlich, wie in cron.
# Y-m-d H:M:S ist das Format (siehe man date)
# Ein * steht für jeden. Und mehrere Werte können mit Kommas getrennt
# angegeben werden: *-*-* *,10,32,51:00 jede 10. Minute und jede 32. und 51.
# Jeden Montag oder Freitag, wenn es der 1.,2. oder 3. des Monats ist
# zu jeder halbe Stunde und 45 Sekunden: Mon,Fri *-*-01,02,03 *:30:45
#
# wir lassen den Testkäse jede Minute laufen:
# also hier: Jedes Jahr,Monat,Tag zu jeder Stunde und jeder Minute,
# WENN die Sekundenzahl 00 ist. (Man beachte die eigenwillige Logik!)
OnCalendar=*-*-* *:*:00
# Welches Servicefile soll den loslegen?
# kein Pfad nötig, weil ja schon in /etc/systemd/*
Unit=stupid_timer.service
# Der Käse soll aktiv werden, wenn Status Mulit-User erreicht wird.
# Also bei jedem Boot erst dann, wenn es bunt wird
# Es gibt viel mehr Möglichkeiten, siehe Freedesktop
[Install]
WantedBy=multi-user.target
Alles anzeigen
Für den Namen gilt dasselbe, wie für .service.
Wir nennen das Timerfile also /etc/systemd/system/stupid_timer.timer
Und damit haben wir alles erledigt
Wir müssen lediglich noch diesen Timer aktivieren:
systemctl enable stupid_timer.timer
# Da wir ja keinen Service aktiviert haben, und systemd die Timer nur bei Systemstart einliest,
# müssen wir, falls wir stupid_timer.timer ändern, den Krempel manuell neu einlesen lassen:
systemctl daemon-reload
Have fun!
13.01.2016 daemon-reload verbessert