Normalement, ne postez pas ici, mais je m'arrache les cheveux pour celui-ci.
J'ai un script Python qui bifurque au lancement et qui est responsable du démarrage d'un tas d'autres processus. Ce script était lancé au démarrage via sysvinit
, mais récemment j'ai mis à niveau vers Debian Jessie donc je l'ai adapté pour le lancer via systemd
.
Malheureusement, je rencontre un problème que je n'arrive pas à résoudre. Lorsque vous lancez le script directement dans un shell utilisateur, il lance correctement ses processus enfants et, lorsque le script se termine, les processus enfants sont orphelins et continuent de s'exécuter.
Lorsqu'il est lancé via systemd, si le processus parent se termine, les enfants se terminent tous aussi (Eh bien, l'screen
s qu'ils se lancent dans le dé et apparaissent comme Morts).
Idéalement, je dois pouvoir redémarrer le script parent sans tuer tous les processus enfants, y a-t-il quelque chose qui me manque ?
Merci !
[Unit]
Description=Server commander
After=network.target
[Service]
User=serveruser
Type=forking
PIDFile=/var/Server/Server.pid
ExecStart=/var/Server/Server.py
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
Modifier :
Il est probablement pertinent pour moi de souligner que le script Python est essentiellement un "contrôleur" pour ses processus enfants. Il démarre et arrête les serveurs dans GNU screen
s à la demande d'un serveur central. Il est normalement toujours en cours d'exécution, il ne génère pas de services et ne se ferme pas.
Il y a cependant des cas où j'aimerais pouvoir recharger le script sans tuer les processus enfants, même si cela signifie que les processus sont orphelins au pid 1. En fait, cela n'aurait même pas d'importance si le script Python démarrait les processus comme un processus parent, si cela est même possible.
Une meilleure explication de son fonctionnement :
systemd
génèreServer.py
Server.py
fork et écrit le fichier pid poursystemd
Server.py
génère ensuite les processus du serveur dans l'écran gnu en fonction de ses instructionsServer.py
continue de s'exécuter pour effectuer les redémarrages demandés au serveur
Lors du lancement sans systemd
, Server.py
peut être redémarré et les screens
GNU il lance ne sont pas affectés. Lors du lancement avec systemd
, lorsque Server.py
s'arrête, au lieu que ces processus d'écran soient orphelins au pid 1, ils sont tués.
Réponse acceptée :
J'ai réussi à résoudre ce problème simplement en définissant KillMode
pour process
au lieu de control-group
(défaut). Merci à tous !