GNU/Linux >> Tutoriels Linux >  >> Linux

Systemd et génération de processus :les processus enfants sont tués lorsque le processus principal se termine ?

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ère Server.py
  • Server.py fork et écrit le fichier pid pour systemd
  • Server.py génère ensuite les processus du serveur dans l'écran gnu en fonction de ses instructions
  • Server.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 !

Connexe :Linux - comment annuler le partage du réseau pour le processus en cours ?
Linux
  1. Processus UNIX / Linux :fonction C fork()

  2. Qu'est-ce qui a tué mon processus et pourquoi ?

  3. Comment trouver tous les processus enfants ?

  4. Impossible de détacher le processus enfant lorsque le processus principal est démarré à partir de systemd

  5. Les threads du noyau Linux sont-ils vraiment des processus du noyau ?

Maîtriser le processus Linux Kill à l'aide de ps, pgrep, pkill et plus

Comment tuer les processus sous Linux en utilisant kill, killall et pkill

Comment faire mourir le processus enfant après la sortie du parent?

Quand utiliser pthread_exit() et quand utiliser pthread_join() sous Linux ?

Linux ssh bash fork retry:aucun processus enfant

Comment exécuter un script lorsqu'un courrier arrive sur le serveur de messagerie ? (Debian)