Re: systemd m'a tuer

Page principale

Répondre à ce message
Auteur: Dominique Fournier
Date:  
À: guilde
Sujet: Re: systemd m'a tuer
Je peux proposer ceci aussi :
https://unix.stackexchange.com/a/602882

Essaie de lancer ton programme préfixé avec "systemd-run --scope --user
command"

Dom

Le 22/06/2022 à 14:21, Dominique Fournier a écrit :
> 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.
>