J'ai vu une solution ici qui semblait élégante, bien qu'un peu détournée. L'idée clé est de créer un service ponctuel déclenché par un minuteur qui en redémarre un autre service.
Pour la minuterie :
[Unit]
Description=Do something daily
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
Pour le service ponctuel :
[Unit]
Description=Restart service
[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl try-restart my_program.service
Pour le service ponctuel sur Ubuntu 16.04 LTS :
[Unit]
Description=Restart service
[Service]
Type=oneshot
ExecStart=/bin/systemctl try-restart my_program.service
Cette solution vous permet de tirer parti des minuteries de systemd, y compris la possibilité de redémarrer le service à une heure particulière de la journée, et pas seulement après un certain temps.
Pour la version systemd>=229, il existe une option appelée RuntimeMaxSec
, qui met fin au service après qu'il ait fonctionné pendant la période donnée.
par exemple. Pour redémarrer tous les 7 jours :
[Service]
Restart=always
RuntimeMaxSec=7d
Cela me semble plus élégant que d'abuser de Type=notify
et WatchdogSec
.
systemd fournit un moyen propre d'ajouter et de remplacer des directives dans les fichiers d'unité systemd fournis par les fournisseurs. Les unités d'insertion sont décrites dans man systemd.unit. Par exemple, si vous vouliez redémarrer périodiquement le service foo fourni par un paquet, vous créeriez un fichier nommé /etc/systemd/system/foo.service.d/periodic-restart.conf
. Le contenu serait comme indiqué ci-dessus. Ensuite :
systemctl daemon-reload
systemctl restart foo
Vous pouvez confirmer que l'unité Drop-In a été chargée car elle sera signalée dans la sortie d'état :
systemctl status
Enfin, vous pouvez confirmer que la directive a été incluse en recherchant le systemctl show
sortie :
systemctl show foo.service | grep RuntimeMax
La directive rapportée par systemctl show
sera "RuntimeMaxUSec`