¿Por qué no se está matando el proceso en segundo plano?

10

Intenté iniciar un script de shell a través de una sesión remota, que inicia un proceso en segundo plano con el comando.

nohup python3 run.py > nohup.out &

Cuando se cierra la sesión remota, el proceso se termina con el mensaje:

Señal atrapada SIGHUP

SIGHUP atrapado pero no demonizado. Saliendo

No entiendo; ¿por qué se mata el proceso cuando se inició en segundo plano usando nohup & ?

Mani más deseado
fuente
1
Solía ​​estar confundido por todo el comportamiento inesperado del control de trabajo de shell. Ahora solo uso tmuxe ignoro nohupo rechazo o hago una tarea en segundo plano por completo.
Siyuan Ren

Respuestas:

10

Su programa Python se deshace nohup.

nohupignora la señal de colgar SIG_IGNy luego carga en cadena su programa en el mismo proceso.

Su programa Python restablece rápidamente el manejo de la señal para la señal de colgar, instalando su propio controlador de señal. Ese controlador verifica una función interna (que no está diseñada muy bien, basándose en algunas suposiciones defectuosas, 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 nohupcompatible. En un sistema con un shell de control de trabajo y una sesión POSIX / semántica de trabajo, debe estar disownhaciendo el trabajo para que el shell nunca lo sepa para enviarle una señal de bloqueo en primer lugar.

(Incluso eso no es suficiente en los sistemas operativos systemd. Debido a que las personas systemd han hecho un poco de su mecanismo de sesión de inicio de sesión en el espacio de usuario, también debe asegurarse de que el mecanismo systemd que señala el cierre del sistema, en lugar de colgar, las sesiones de inicio de sesión en cada cierre de sesión tampoco se activan).

Otras lecturas

JdeBP
fuente
3
¿Es su programa Python el que lo hace, o es el intérprete de Python (/ entorno de tiempo de ejecución) que lo hace silenciosamente a sus espaldas?
ilkkachu
Además, en Mac OS, cerrar sesión desde una sesión ssh mata los trabajos de shell, incluso cuando se comienza a usar nohup; no he encontrado un remedio para ello
imhotap
Bueno, si el problema es el controlador de señal, el OP podría simplemente cambiar el controlador de señal a un controlador que no interrumpa el proceso. Esto debería funcionar independientemente de quién instala dicho controlador de señal. Me gustaría agregar sobre ssh: a veces, incluso si el proceso se mantiene vivo, puede tener problemas. Hace un par de años perdí bastante tiempo tratando de entender algunos errores de permisos y, al final, el culpable era Kerberos: cuando se cerró la sesión ssh, los tokens caducaron, así que tuve que crear nuevos tokens para usarlos en lugar de esos de la sesión ssh.
Bakuriu
@JdeBP Lo intenté setsid nohup python3 run.py > nohup.out &, setsid ha resuelto este problema. ¿Es este un enfoque adecuado?
Mani más deseado el