Viděl jsem zde řešení, které se zdálo elegantní, i když trochu kruhové. Klíčovou myšlenkou je vytvořit jednorázovou službu spouštěnou časovačem, který restartuje další servis.
Pro časovač:
[Unit]
Description=Do something daily
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
Pro jednorázovou službu:
[Unit]
Description=Restart service
[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl try-restart my_program.service
Pro jednorázovou službu na Ubuntu 16.04 LTS:
[Unit]
Description=Restart service
[Service]
Type=oneshot
ExecStart=/bin/systemctl try-restart my_program.service
Toto řešení vám umožňuje využít časovače systemd, včetně možnosti restartovat službu v určitou denní dobu, a ne až po uplynutí určité doby.
Pro systemd verzi>=229 existuje možnost nazvaná RuntimeMaxSec
, který ukončí službu po jejím běhu po danou dobu.
např. Restartování každých 7 dní:
[Service]
Restart=always
RuntimeMaxSec=7d
Zdá se mi to elegantnější než zneužívání Type=notify
a WatchdogSec
.
systemd poskytuje čistý způsob přidávání a přepisování direktiv v souborech jednotek systemd poskytovaných dodavateli. Drop-In jednotky jsou popsány v man systemd.unit. Pokud byste například chtěli pravidelně restartovat službu foo poskytovanou balíčkem, vytvořili byste soubor s názvem /etc/systemd/system/foo.service.d/periodic-restart.conf
. Obsah by byl takový, jak je uvedeno výše. Potom:
systemctl daemon-reload
systemctl restart foo
Můžete potvrdit, že jednotka Drop-In byla načtena, protože bude hlášena ve výstupu stavu:
systemctl status
Nakonec můžete potvrdit, že direktiva byla zahrnuta, vyhledáním systemctl show
výstup:
systemctl show foo.service | grep RuntimeMax
Direktiva hlášená systemctl show
bude "RuntimeMaxUSec"