
Intenté iniciar un script de shell a través de una sesión remota, que inicia un proceso en segundo plano usando el comando.
nohup python3 run.py > nohup.out &
Cuando se cierra la sesión remota, el proceso se cierra con el mensaje:
Señal captada SIGHUP
SIGHUP atrapado pero no demonizado. Saliendo.
No entiendo; ¿Por qué el proceso se cancela cuando se inició en segundo plano usandonohup &?
Respuesta1
Su programa Python lo deshace nohup
.
nohup
ignora la señal de colgar SIG_IGN
y luego carga en cadena su programa en el mismo proceso.
Tu programa Pythonse reinicia rápidamenteel manejo de señal para la señal de colgar, instalando su propio manejador de señal. Ese controlador verifica una función interna (que no está muy bien diseñada, ya que se basa en algunas suposiciones erróneas, si es la que he visto) y decide que el curso de acción apropiado al recibir una señal de colgar es imprimir ese mensaje. y salir.
Su programa Python por diseño no es nohup
capaz. En un sistema con un shell de control de trabajos y semántica de sesión/trabajo POSIX, es necesario realizar disown
el trabajo de modo que el shell nunca se entere para enviarle una señal de colgar en primer lugar.
(Incluso eso no es suficiente en los sistemas operativos systemd. Debido a que la gente de systemd ha hecho un poco de oreja de cerdo con su mecanismo de sesión de inicio de sesión en el espacio de usuario, también debe asegurarse de que el mecanismo de systemd que señala el apagado del sistema, en lugar de colgar, para Las sesiones de inicio de sesión en cada cierre de sesión tampoco se activan).
Otras lecturas
- https://docs.cherrypy.org/en/latest/_modules/cherrypy/process/plugins.html
- ¿Nohup intenta hacer que el programa no tenga una terminal de control?
- Diferencia entre nohup, repudiar y &
- Cuando tmux sale (cierra pty master), los procesos en segundo plano de los scripts de inicio mueren, ¿por qué?
- https://unix.stackexchange.com/a/310775/5132
- https://unix.stackexchange.com/a/379264/5132