Comment configurer un service systemd pour qu'il redémarre périodiquement?
j'ai un simple service systemd qui doit être redémarré périodiquement pour éviter que son processus ne se déclenche. Existe-t-il une option de configuration permettant aux services de systemd de les redémarrer périodiquement? Tous les Restart*
options semblent se rapporter à la remise en marche du service à sa sortie.
5 réponses
Oui, vous pouvez faire à votre service pour redémarrer régulièrement en faisant votre service des Type=notify
.
Ajoutez cette option dans la section [Service] de votre fichier service avec Restart=always
et donner WatchdogSec=xx
où xx est la période de temps dans le deuxième vous voulez redémarrer votre service. Ici, votre processus sera tué par systemd après xx périodes et sera redémarré par systemd à nouveau.
pour eg.
[Unit]
.
.
[Service]
Type=notify
.
.
WatchdogSec=10
Restart=always
.
.
[Install]
WantedBy= ....
j'ai vu une solution ici qui semblait élégant, si un peu rond-point. L'idée clé est de créer un service one-shot déclenché par une minuterie qui redémarre un autre service.
Pour la minuterie:
[Unit]
Description=Do something daily
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timer.target
Pour les one-shot de service:
[Unit]
Description=Restart service
[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl try-restart my_program.service
pour le service one-shot 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 à un l'heure particulière de la journée, et pas seulement après qu'un certain temps se soit écoulé.
cela n'était peut-être pas le cas au moment où la question a été posée, mais il y a maintenant une option appelée RuntimeMaxSec
, qui met fin au service après qu'il a été en cours d'exécution pour la période donnée.
e.g.
[Service]
Restart=always
RuntimeMaxSec=604800
cela me semble plus élégant que d'abuser Type=notify
et WatchdogSec
.
Que Diriez-vous d'une crontab comme
30 3 * * sun /bin/systemctl restart yourService
qui relancerait le service votre service à 3h30 chaque dimanche.
Juste quelques autres approches pour finalement atteindre le même objectif:
- si vous avez le contrôle sur l'implémentation du service, vous pouvez le faire finir volontairement après un certain temps, par exemple soit simplement quitter après un certain nombre d'itérations (si applicable) ou en utilisant un timeout timer avec un handler sendin lui-même un SIGTERM/SIGKILL
- si la fin du service volontaire n'est pas faisable / pratique, vous pourriez avoir un petit script cron-based tuant le service processus(es).