GNU/Linux >> Tutoriales Linux >  >> Linux

Systemd y proceso de desove:¿los procesos secundarios se eliminan cuando el proceso principal sale?

Normalmente no publico aquí, pero me estoy arrancando los pelos por esto.
Tengo un script de Python que se bifurca cuando se inicia y es responsable de iniciar un montón de otros procesos. Este script solía iniciarse al inicio a través de sysvinit , pero recientemente actualicé a Debian Jessie, así que lo adapté para que se inicie a través de systemd .

Desafortunadamente, tengo un problema que no puedo resolver. Cuando inicia la secuencia de comandos directamente en un shell de usuario, inicia sus procesos secundarios correctamente, y cuando la secuencia de comandos sale, los procesos secundarios quedan huérfanos y continúan ejecutándose.

Cuando se inicia a través de systemd, si el proceso principal sale, todos los hijos también salen (Bueno, la screen s que se lanzan al morir y aparecen como Muertos).

Idealmente, necesito poder reiniciar el script principal sin matar todos los procesos secundarios, ¿hay algo que me falta?

¡Gracias!

[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

Editar:

Probablemente sea relevante para mí señalar que el script de Python es esencialmente un "controlador" para sus procesos secundarios. Inicia y detiene servidores en GNU screen s según lo solicitado desde un servidor central. Normalmente siempre se está ejecutando, no genera servicios ni sale.

Sin embargo, hay casos en los que me gustaría poder volver a cargar la secuencia de comandos sin eliminar los procesos secundarios, incluso si eso significa que los procesos quedan huérfanos en el pid 1. De hecho, ni siquiera importaría si la secuencia de comandos de Python comenzara los procesos como un proceso principal, si eso es posible.

Una mejor explicación de cómo funciona:

  • systemd genera Server.py
  • Server.py bifurca y escribe el archivo pid para systemd
  • Server.py luego genera procesos de servidor en la pantalla gnu según sus instrucciones
  • Server.py continúa ejecutándose para realizar cualquier reinicio solicitado desde el servidor

Al iniciar sin systemd , Server.py se puede reiniciar y las screens de GNU que lanza no se ven afectados. Al iniciar con systemd , cuando Server.py se apaga, en lugar de que esos procesos de pantalla queden huérfanos en pid 1, se eliminan.

Respuesta aceptada:

Logré arreglar esto simplemente configurando KillMode para process en lugar de control-group (defecto). ¡Gracias a todos!

Relacionado:Linux:¿cómo dejar de compartir la red para el proceso actual?
Linux
  1. Cómo depurar el proceso de arranque de systemd en CentOS/RHEL 7 y 8

  2. ¿Cómo hacer que el proceso hijo muera después de que el padre salga?

  3. ¿Qué mató mi proceso y por qué?

  4. ¿Cómo encontrar todos los procesos secundarios?

  5. Reintento de la bifurcación Linux ssh bash:no hay procesos secundarios

¿Por qué el Pgid de los procesos secundarios no es el Pid del padre?

Proceso de entrada y número de procesos explicados

Master Linux Kill Process usando ps, pgrep, pkill y más

Procesos UNIX/Linux:Función C fork()

¿Qué son los procesos, subprocesos, procesos ligeros y estado del proceso de Linux?

Cómo matar procesos en Linux usando kill, killall y pkill