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.
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= ....
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
.
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.
Que diriez-vous d'un crontab comme
30 3 * * Sun /bin/systemctl restart yourService
qui redémarrerait le service yourService à 3h30 chaque dimanche.
Juste quelques approches alternatives pour finalement atteindre le même objectif:
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.