Normalement, je ne poste pas ici, mais j'arrache mes cheveux par-dessus. J'ai un script Python qui bifurque lors de son lancement et 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, je l'ai donc adapté pour être lancé via systemd.
Malheureusement, je rencontre un problème que je ne peux 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.
Au lancement via systemd, si le processus parent se termine, les enfants sortent tous aussi (Eh bien, les écrans qu'ils lancent meurent 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
Edit: 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 les écrans GNU à 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 quitte 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 a démarré les processus comme un processus parent, si cela est même possible.
Une meilleure explication de son fonctionnement:
- Systemd apparaît /Server.py
- Server.py fourche et écrit le fichier pid pour Systemd
- Server.py génère ensuite les processus serveur dans l'écran GNU en fonction de ses instructions
- Server.py continue de s'exécuter pour effectuer tous les redémarrages demandés au serveur
Lors du lancement sans Systemd, Server.py peut être redémarré et les écrans GNU qu'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 rendus orphelins au pid 1, ils sont tués.
simple
ou forking
, en fait), le dernier recours serait Type=oneshot
, RemainAfterExit=yes
et KillMode=control-group
.
Server.py
code et une description de la façon dont les services lancés se bifurquent (s'ils se bifurquent). Cependant, d'une manière générale, il s'agit d'un problème de non-concordance du protocole de préparation .