Contexte
On m'a demandé de créer un systemd
script pour un nouveau service, foo_daemon
qui se met parfois dans un "mauvais état" et ne mourra pas SIGTERM
(probablement à cause du gestionnaire de signal personnalisé). Cela est problématique pour les développeurs, car ils sont invités à démarrer / arrêter / redémarrer le service via:
systemctl start foo_daemon.service
systemctl stop foo_daemon.service
systemctl restart foo_daemon.service
Problème
Parfois, en raison d' foo_daemon
un mauvais état, nous devons le tuer de force via:
systemctl kill -s KILL foo_daemon.service
Question
Comment puis-je configurer mon systemd
script pour foo_daemon
que, chaque fois qu'un utilisateur tente d'arrêter / redémarrer le service systemd
:
- Essayez d'arrêter gracieusement le
foo_daemon
viaSIGTERM
. - Accordez jusqu'à 2 secondes pour que l'arrêt / l'arrêt
foo_daemon
se termine. - Essayez d'arrêter forcé
foo_daemon
viaSIGKILL
si le processus est toujours en cours (nous n'avons donc pas de risque de recyclage du PID et desystemd
problèmeSIGKILL
avec le mauvais PID). L'appareil que nous testons génère / accélère de nombreux processus rapidement, il existe donc une préoccupation rare mais très réelle concernant le recyclage du PID, qui pose problème. - Si, dans la pratique, je suis juste paranoïaque à propos du recyclage des PID, je suis d'accord avec le script qui vient d'être émis
SIGKILL
contre le PID du processus sans se soucier de tuer un PID recyclé.
Réponses:
systemd prend déjà cela en charge et il est activé par défaut .
La seule chose que vous voudrez peut-être personnaliser est le délai d'attente, que vous pouvez utiliser
TimeoutStopSec=
. Par exemple:Maintenant, systemd enverra un SIGTERM, attendra deux secondes que le service se termine, et si ce n'est pas le cas, il enverra un SIGKILL.
Si votre service n'est pas compatible avec systemd, vous devrez peut-être fournir le chemin d'accès à son fichier PID avec
PIDFile=
.Enfin, vous avez mentionné que votre démon engendre de nombreux processus. Dans ce cas, vous souhaiterez peut-être définir
KillMode=control-group
et systemd enverra des signaux à tous les processus du groupe de contrôle.la source
Type=simple
dans l'unité systemd.Type=forking
a l'avantage (si le service a été correctement écrit) d'informer systemd quand il est complètement «prêt», ce que Type = simple ne peut pas faire. Démoniser n'est pas un problème, même sans fichier PID - systemd suivra de toute façon le processus principal.Type=notify
systemd est préférable pour systemd, et de nombreux services communs le font déjà. Mais probablement pas ce service hérité. Dans le cas du PO, il dispose d'un service qui engendre de nombreux processus. Les documents systemd mettent en garde contre ce cas .Étant donné que personne n'a mentionné le besoin
Type=oneshot
, voici un exemple complet qui se termine en raison d'un échec de temporisation.la source