On m'a demandé de créer un script systemd
pour un nouveau service, foo_daemon
, qui entre parfois dans un "mauvais état" et ne mourra pas via SIGTERM
(probablement en raison 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
Parfois, en raison de foo_daemon
entrer dans un mauvais état, nous devons le tuer de force via:
systemctl kill -s KILL foo_daemon.service
Comment configurer mon script systemd
pour foo_daemon
de sorte que, chaque fois qu'un utilisateur tente d'arrêter/redémarrer le service, systemd
:
foo_daemon
via SIGTERM
.foo_daemon
compléter.foo_daemon
via SIGKILL
si le processus est toujours en cours (nous n'avons donc pas de risque de recyclage du PID et systemd
émet SIGKILL
contre le mauvais PID). L'appareil que nous testons génère/opère rapidement de nombreux processus, il y a donc une préoccupation rare mais très réelle concernant le recyclage PID qui cause un problème.SIGKILL
contre le PID du processus sans se soucier de tuer un PID recyclé.systemd prend déjà cela en charge, et c'est activé par défaut .
La seule chose que vous voudrez peut-être personnaliser est le délai d'expiration, que vous pouvez faire avec TimeoutStopSec=
. Par exemple:
[Service]
TimeoutStopSec=2
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 enverront des signaux à tous les processus du groupe de contrôle.
Puisque personne n'a mentionné avoir besoin de Type=oneshot
, voici un exemple complet qui se termine en raison d'un échec de temporisation.
[Unit]
Description=timeout test
[Service]
Type=oneshot
TimeoutStartSec=2
ExecStart=/bin/sleep 10