Ho visto una soluzione qui che sembrava elegante, anche se un po' indiretta. L'idea chiave è creare un servizio one-shot attivato da un timer che ne riavvia un altro servizio.
Per il timer:
[Unit]
Description=Do something daily
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
Per il servizio one-shot:
[Unit]
Description=Restart service
[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl try-restart my_program.service
Per il servizio one-shot su Ubuntu 16.04 LTS:
[Unit]
Description=Restart service
[Service]
Type=oneshot
ExecStart=/bin/systemctl try-restart my_program.service
Questa soluzione ti consente di sfruttare i timer di systemd, inclusa la possibilità di riavviare il servizio a una determinata ora del giorno e non solo dopo che è trascorso un certo periodo di tempo.
Per la versione di systemd>=229, c'è un'opzione chiamata RuntimeMaxSec
, che termina il servizio dopo che è rimasto in esecuzione per un determinato periodo di tempo.
per esempio. Per riavviare ogni 7 giorni:
[Service]
Restart=always
RuntimeMaxSec=7d
A me questo sembra più elegante che abusare di Type=notify
e WatchdogSec
.
systemd fornisce un modo pulito per aggiungere e sovrascrivere le direttive nei file unit systemd forniti dai fornitori. Le unità drop-in sono descritte in man systemd.unit. Ad esempio, se volessi riavviare periodicamente il servizio foo fornito da un pacchetto, dovresti creare un file chiamato /etc/systemd/system/foo.service.d/periodic-restart.conf
. Il contenuto sarebbe come mostrato sopra. Quindi:
systemctl daemon-reload
systemctl restart foo
Puoi confermare che l'unità Drop-In è stata caricata perché verrà segnalata nell'output di stato:
systemctl status
Infine, puoi confermare che la direttiva è stata inclusa cercando systemctl show
uscita:
systemctl show foo.service | grep RuntimeMax
La direttiva riportata da systemctl show
sarà "RuntimeMaxUSec`