web-dev-qa-db-fra.com

Comment puis-je configurer un service systemd pour redémarrer périodiquement?

J'ai un service systemd simple qui doit être redémarré périodiquement pour empêcher son processus de bogue. Existe-t-il une option de configuration pour les services systemd pour les redémarrer périodiquement? La totalité de la Restart* options semble concerner le redémarrage du service à sa sortie.

37
wes

Oui, vous pouvez effectuer votre service pour le redémarrer périodiquement en rendant votre service de Type=notify. Ajoutez cette option dans la section [Service] de votre fichier de service avec Restart=always Et donner WatchdogSec=xx, où xx est la période en secondes pendant laquelle vous souhaitez redémarrer votre service. Ici, votre processus sera tué par systemd après la période de temps xx et sera redémarré par systemd à nouveau. par exemple.

[Unit]
.
.

[Service]
Type=notify
.
.
WatchdogSec=10
Restart=always
.
.

[Install]
WantedBy= ....
31
Saturn

Cela n'était peut-être pas présent au moment où la question a été posée, mais il existe maintenant une option appelée RuntimeMaxSec , qui met fin au service après son exécution pendant la période de temps donnée .

par exemple.

[Service]
Restart=always
RuntimeMaxSec=604800

Cela me semble plus élégant que d'abuser Type=notify et WatchdogSec.

49
Alex Forbes

J'ai vu une solution ici qui semblait élégante, même si elle était un peu détournée. L'idée clé est de créer un service ponctuel 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=timers.target

Pour le service one-shot:

[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 à une heure particulière de la journée, et pas seulement après un certain temps.

29
matmat

Que diriez-vous d'un crontab comme

30 3 * * Sun /bin/systemctl restart yourService

qui redémarrerait le service yourService à 3h30 chaque dimanche.

13
Fritz Zaucker

Juste quelques approches alternatives pour finalement atteindre le même objectif:

  • si vous avez le contrôle sur l'implémentation du service, vous pouvez le faire se terminer volontairement après un certain temps, par exemple, soit quitter simplement après un certain nombre d'itérations (le cas échéant), soit utiliser un temporisateur avec un gestionnaire qui envoie lui-même un SIGTERM/SIGKILL
  • si la fin du service volontaire n'est pas faisable/pratique, vous pourriez avoir un petit script basé sur cron tuant le (s) processus de service.
3
Dan Cornilescu

Je voulais commenter le

[Service]
Restart=always
RuntimeMaxSec=604800

répondez ci-dessus mais ne pouvez pas avoir plus de points.

Le commentaire est que cette solution invoquera la gestion des pannes définie par OnFailure=failure_handling.service. Étant donné que le redémarrage planifié n'est pas un véritable échec, la journalisation, les notifications, etc. du service de gestion des échecs seront indésirables et probablement perturbatrices.

Un redémarrage périodique réel serait une fonctionnalité raisonnable pour systemd, mais je ne retiendrai pas mon souffle.

2
E Gow