Ich sah hier eine Lösung, die elegant, wenn auch etwas umständlich erschien. Die Schlüsselidee besteht darin, einen One-Shot-Dienst zu erstellen, der von einem Timer ausgelöst wird, der einen anderen neu startet Service.
Für den Timer:
[Unit]
Description=Do something daily
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
Für den One-Shot-Service:
[Unit]
Description=Restart service
[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl try-restart my_program.service
Für den One-Shot-Dienst auf Ubuntu 16.04 LTS:
[Unit]
Description=Restart service
[Service]
Type=oneshot
ExecStart=/bin/systemctl try-restart my_program.service
Mit dieser Lösung können Sie die Timer von systemd nutzen, einschließlich der Möglichkeit, den Dienst zu einer bestimmten Tageszeit und nicht nur nach Ablauf einer bestimmten Zeit neu zu starten.
Für systemd-Version>=229 gibt es eine Option namens RuntimeMaxSec
, wodurch der Dienst beendet wird, nachdem er für den angegebenen Zeitraum ausgeführt wurde.
z.B. Alle 7 Tage neu starten:
[Service]
Restart=always
RuntimeMaxSec=7d
Das erscheint mir eleganter, als Type=notify
zu missbrauchen und WatchdogSec
.
systemd bietet eine saubere Möglichkeit, Anweisungen in systemd-Unit-Dateien hinzuzufügen und zu überschreiben, die von Anbietern bereitgestellt werden. Drop-In Units werden in man systemd.unit beschrieben. Wenn Sie beispielsweise den von einem Paket bereitgestellten foo-Dienst regelmäßig neu starten möchten, würden Sie eine Datei mit dem Namen /etc/systemd/system/foo.service.d/periodic-restart.conf
erstellen . Der Inhalt wäre wie oben gezeigt. Dann:
systemctl daemon-reload
systemctl restart foo
Sie können bestätigen, dass die Drop-In-Einheit geladen wurde, da dies in der Statusausgabe gemeldet wird:
systemctl status
Schließlich können Sie bestätigen, dass die Anweisung aufgenommen wurde, indem Sie nach systemctl show
suchen Ausgabe:
systemctl show foo.service | grep RuntimeMax
Die von systemctl show
gemeldete Direktive wird "RuntimeMaxUSec`