Leí una respuesta de un usuario que afirmó que ejecuta
foo 2>&1 >& output.log &
resultaría en foo
continuar 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 nohup
en tales casos, o tmux
, screen
et 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 exit
escribí, cuando Zsh me advirtió que tenía trabajos en ejecución, y después de escribir exit
por segunda vez, me dijo que había AUMENTADO un trabajo. Hacer exactamente lo mismo en Bash deja el trabajo en marcha ...
logout
yyes
todavía se está ejecutando.Respuestas:
Bash parece enviar el
SIGHUP
único si recibió un aSIGHUP
, lo que ocurre, por ejemplo, cuando se cierra un terminal virtual o cuando se interrumpe la conexión SSH. De la documentación :Entonces, si escribe
exit
o 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
Hay una opción para enviar la
SIGHUP
salida al estar en un shell interactivo ( ver aquí ). Pero no funciona en mi máquina con Bash 4.2.25. Tal vez te funcionefuente
SIGHUP
se envía, de lo contrario, con una salida limpia, ¿los trabajos continúan ejecutándose? Eso explica lo que vi.huponexit
es "solo en efecto para shells de inicio de sesión interactivos"