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 & ?
background-process
nohup
Mani más deseado
fuente
fuente
tmux
e ignoronohup
o rechazo o hago una tarea en segundo plano por completo.Respuestas:
Su programa Python se deshace
nohup
.nohup
ignora la señal de colgarSIG_IGN
y 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
nohup
compatible. En un sistema con un shell de control de trabajo y una sesión POSIX / semántica de trabajo, debe estardisown
haciendo 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
fuente
nohup
; no he encontrado un remedio para ellosetsid nohup python3 run.py > nohup.out &
, setsid ha resuelto este problema. ¿Es este un enfoque adecuado?