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.

23
demandé sur wes 2015-06-25 18:55:23

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= ....
23
répondu Saturn 2017-09-13 04:12:00

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é.

19
répondu matmat 2017-12-06 20:46:42

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.

19
répondu Alex Forbes 2018-05-14 14:01:46

Que Diriez-vous d'une crontab comme

30 3 * * sun /bin/systemctl restart yourService

qui relancerait le service votre service à 3h30 chaque dimanche.

4
répondu Fritz Zaucker 2018-03-28 06:09:36

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).
3
répondu Dan Cornilescu 2015-06-25 17:22:43