¿En qué casos SIGHUP no se envía a un trabajo cuando cierra la sesión?

10

Leí una respuesta de un usuario que afirmó que ejecuta

foo 2>&1 >& output.log &

resultaría en foocontinuar ejecutándose incluso cuando cierren sesión. Según este usuario, esto incluso funcionó a través de conexiones SSH.

Realmente no creía eso, ya que tenía la impresión de que en el caso de desconectarse de SSH o terminar el TTY, el shell y, por lo tanto, sus procesos recibirían un SIGHUP, lo que provocaría que finalizaran. Esto, bajo mi suposición, fue la única razón para usar nohupen tales casos, o tmux, screenet al.

Luego busqué en el manual de glibc :

Esta señal también se usa para informar la terminación del proceso de control en un terminal a los trabajos asociados con esa sesión; Esta terminación desconecta efectivamente todos los procesos en la sesión del terminal de control.

Esto parece confirmar mis pensamientos. Pero mirando más allá, dice :

Si el proceso es un líder de sesión que tiene un terminal de control, se envía una señal SIGHUP a cada proceso en el trabajo en primer plano, y el terminal de control se disocia de esa sesión.

Entonces, ¿esto significa que los trabajos puestos en segundo plano no recibirán SIGHUP?

Para mi mayor confusión, ejecuté una sesión interactiva de Zsh, ejecuté yes >& /dev/null &y exitescribí, cuando Zsh me advirtió que tenía trabajos en ejecución, y después de escribir exitpor segunda vez, me dijo que había AUMENTADO un trabajo. Hacer exactamente lo mismo en Bash deja el trabajo en marcha ...

slhck
fuente
He tenido problemas con un servidor en el pasado que se desconecta repentinamente a través de ssh, y mi proceso seguía ejecutándose pero sin ningún tty asociado, así que tuve que iniciar sesión nuevamente y enviar SIGHUP / TERM / KILL para finalizarlos. Entonces, siguiendo la misma lógica, acabo de probar, escribí logouty yestodavía se está ejecutando.
Braiam
Además de si se envía o no SIGHUP, si un proceso ha definido un controlador de señal (y captura SIGHUP) o una máscara de señal son factores adicionales para determinar si se termina cuando se envía esa señal. Entonces, el hecho de que siga ejecutándose después de cerrar sesión no significa que no se haya enviado esa señal
Tim B,
¿Se refiere a esta pregunta: serverfault.com/questions/115999/… ? La respuesta parece encontrarse allí: RedHat no configura shopt de forma predeterminada. Es la peculiaridad de configuración particular de RedHat.
Boris Burkov
@Bob No, no he visto este antes, pero es un buen recurso. ¡Gracias!
slhck
Me alegra que haya ayudado. En realidad, Raphael se está refiriendo a ese tema también.
Boris Burkov

Respuestas:

18

Bash parece enviar el SIGHUPúnico si recibió un a SIGHUP, lo que ocurre, por ejemplo, cuando se cierra un terminal virtual o cuando se interrumpe la conexión SSH. De la documentación :

El shell sale por defecto al recibir un SIGHUP. Antes de salir, un shell interactivo reenvía el SIGHUP a todos los trabajos, en ejecución o detenidos. Los trabajos detenidos se envían SIGCONT para garantizar que reciban el SIGHUP. Para evitar que el shell envíe la señal SIGHUP a un trabajo en particular, debe eliminarse de la tabla de trabajos con el código interno Desconocido (consulte el Código de control del trabajo) o marcarlo para que no reciba el mensaje SIGHUP usando disown -h.

Entonces, si escribe exito presiona Ctrl+, Dtodo el proceso en segundo plano permanecerá, ya que esto no envía una señal de colgar al Bash.

Puede obligar a Bash a advertirle sobre el hecho de que todavía se están ejecutando procesos en segundo plano con

shopt -s checkjobs

Hay una opción para enviar la SIGHUPsalida al estar en un shell interactivo ( ver aquí ). Pero no funciona en mi máquina con Bash 4.2.25. Tal vez te funcione

shopt -s huponexit
Raphael Ahrens
fuente
Entonces, cuando una conexión SSH se interrumpe, SIGHUPse envía, de lo contrario, con una salida limpia, ¿los trabajos continúan ejecutándose? Eso explica lo que vi.
slhck
Si. La señal de colgar solo está ahí para el caso especial, cuando se interrumpe la conexión con el usuario.
Raphael Ahrens
Continuemos esta discusión en el chat .
Martin Kunev
@npostavs gracias por la información que agregué en la respuesta.
Raphael Ahrens