Re: systemd m'a tuer

Page principale

Répondre à ce message
Auteur: Dominique Fournier
Date:  
À: guilde
Sujet: Re: systemd m'a tuer
Bonjour Edgar

Je peux te proposer de regarder cette page de manuel :
https://www.freedesktop.org/software/systemd/man/systemd.kill.html

Tu peux alors définir les actions que fait systemd pour arrêter un service.
Dans /lib/systemd/system/ssh.service, ils ont utilisé :
KillMode=process


Dans /lib/systemd/system/nginx.service, on trouve par exemple :
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5
--pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed

Cela te permettrait d'arrêter le service en 5 SIGTERM avant le kill.

Dom

Le 22/06/2022 à 11:23, Edgar Bonet a écrit :
> Bonjour la Guilde !
>
> J'ai une question sur la façon dont systemd tue les processus lors d'un
> shutdown, et sur la façon de contrôler ça.
>
> Pour le contexte : je travaille sur un code de simulation pour des
> calculs lourds qui peuvent durer plusieurs jours. La machine qui héberge
> le processus sera dans un rack muni d'un système de climatisation qui
> n'est pas super-fiable. La personne responsable de ce rack a prévu
> d'installer un petit démon qui surveille la température de la machine
> et, en cas de surchauffe, fait un « poweroff ». J'aimerais faire en
> sorte que, dans un telle situation, mon programme sauvegarde sur disque
> l'état du calcul avant de se terminer.
>
> Mon idée était que, lors de l'arrêt du système, systemd devait envoyer
> SIGTERM à tous les processus, puis leur laisser un petit répit, puis
> envoyer SIGKILL à ceux qui seraient encore là. Je n'aurais donc qu'à
> intercepter SIGTERM pour savoir quand il faut sauvegarder l'état et se
> terminer proprement. J'ai écrit le petit programme ci-joint pour tester
> cette idée et... ça ne marche pas ! Je lance le programme en arrière
> plan et :
>
>   - si je lui envoie moi même SIGTERM (avec kill), il enregistre bien le
>     message dans le fichier de sortie avant de quitter

>
>   - si au lieu de ça je fais « sudo poweroff », il n'y a rien dans le
>     fichier de sortie.

>
> Testé sur une Ubuntu 20.04. J'imagine donc que systemd n'a pas la
> gentillesse d'envoyer SIGTERM avant de tuer tous les processus. :-(
>
> Est-ce que j'ai pas compris quelque chose ? La séquence (SIGTERM, répit,
> SIGKILL) n'est-elle pas depuis longtemps la façon standard de tout
> arrêter sur un système Unix ? Est-ce que ce comportement est
> configurable ? Tout ce que j'ai trouvé dans mes recherches concerne la
> façon dont systemd tue les services dont il est responsable, ce qui
> n'est pas le cas de ce programme de calcul.
>
> Merci de votre attention,
>
> Edgar.