Normalmente no publico aquí, pero me estoy arrancando el pelo por este. 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 lanzarse al inicio a través de sysvinit, pero recientemente me actualicé a Debian Jessie, así que lo he adaptado para que se inicie a través de systemd.
Desafortunadamente, me encuentro con un problema que no puedo resolver. Cuando inicia el script directamente en un shell de usuario, inicia sus procesos secundarios correctamente, y cuando el script sale, los procesos secundarios quedan huérfanos y continúan ejecutándose.
Cuando se inicia a través de systemd, si el proceso padre sale, todos los hijos también salen (¿Bueno, la pantalla que lanzan mueren y aparecen como muertos?)
Idealmente, necesito poder reiniciar el script principal sin eliminar 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 Python es esencialmente un 'controlador' para sus procesos secundarios. Inicia y detiene servidores en pantallas de GNU según lo solicitado desde un servidor central. Normalmente siempre se está ejecutando, no genera servicios y sale. Sin embargo, hay casos en los que me gustaría poder volver a cargar el script sin eliminar los procesos secundarios, incluso si eso significa que los procesos quedan huérfanos a pid 1. De hecho, ni siquiera importaría si el script Python comenzara los procesos como un proceso padre, si eso es posible.
Una mejor explicación de cómo funciona:
- Systemd genera /Server.py
- Server.py se bifurca y escribe el archivo pid para Systemd
- Server.py genera procesos de servidor en la pantalla de GNU según sus instrucciones
- Server.py continúa ejecutándose para realizar cualquier reinicio solicitado desde el servidor
Cuando se inicia sin Systemd, Server.py se puede reiniciar y las pantallas gnu que inicia no se ven afectadas. Cuando se inicia con Systemd, cuando Server.py se cierra, en lugar de que los procesos de la pantalla se queden huérfanos a pid 1, se eliminan.
simple
o forking
, en realidad), el último recurso sería Type=oneshot
, RemainAfterExit=yes
y KillMode=control-group
.
Server.py
código y una descripción de cómo se bifurcan los servicios lanzados (si se bifurcan). Sin embargo, en términos generales, este es un problema de falta de coincidencia del protocolo de preparación .