Este es un seguimiento de esta pregunta .
He corrido algunas pruebas más; parece que realmente no importa si esto se hace en la consola física o a través de SSH, tampoco sucede esto solo con SCP; También lo probé con cat /dev/zero > /dev/null
. El comportamiento es exactamente el mismo:
- Inicie un proceso en segundo plano usando
&
(o póngalo en segundo plano después de que haya comenzado a usarCTRL-Z
ybg
); Esto se hace sin usarnohup
. - Desconectarse.
- Inicie sesión nuevamente.
- El proceso todavía está allí, funcionando felizmente, y ahora es un hijo directo de
init
.
Puedo confirmar que SCP y CAT se cierren inmediatamente si se me envía un SIGHUP
; Probé esto usando kill -HUP
.
Entonces, realmente parece que SIGHUP no se envía al cerrar sesión, al menos a procesos en segundo plano (no se puede probar con uno en primer plano por razones obvias).
Esto me sucedió inicialmente con la consola de servicio de VMware ESX 3.5 (que se basa en RedHat), pero pude replicarlo exactamente en CentOS 5.4.
La pregunta es, nuevamente: ¿no debería enviarse un SIGHUP a los procesos, incluso si se ejecutan en segundo plano, al cerrar sesión? ¿Por qué esto no está sucediendo?
Editar
Lo comprobé strace
, según la respuesta de Kyle.
Como esperaba, el proceso no recibe ninguna señal al cerrar sesión desde el shell donde se inició. Esto sucede tanto cuando se usa la consola del servidor como a través de SSH.
--- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=10676, si_uid=3000090} --- rt_sigreturn() = -1 EINTR (Interrupted system call) rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=13944, si_uid=3000090} --- +++ killed by SIGHUP +++
huponexit
.Respuestas:
Respuesta encontrada.
Para BASH, esto depende de la
huponexit
opción de shell, que se puede ver y / o configurar con elshopt
comando incorporado .Parece que esta opción está desactivada de forma predeterminada, al menos en los sistemas basados en RedHat.
Más información en la página de manual de BASH :
fuente
Se enviará SIGHUP en mis pruebas:
Shell1:
Shell2:
Shell1 nuevamente:
Shell2 nuevamente :
¿Por qué sigue ejecutándose ?: La programación
avanzada en el entorno Unix de Stevens cubre esto en la sección 9.10: Grupos de procesos huérfanos. La sección más relevante es:
fuente
$ strace -e signal -p1705 Process 1705 attached --- stopped by SIGTSTP --- --- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=791, si_uid=3000090} --- +++ killed by SIGTERM +++
Extraño, definitivamente no de acuerdo con la sección citada de Stevens.Ejecuté algunas pruebas usando CentOS 7.1 y bash. Tenga en cuenta que esto significa que
huponexit
esoff
por defecto, y estaba apagado para la mayoría de mis pruebas.Necesitas
nohup
cuando comienzas un trabajo en una terminal, porque si cierras esa terminal sin salir de la shell limpiamente , la terminal envía la señal SIGHUP a la shell, que luego la envía a todos los niños. Si sale del shell limpiamente, lo que significa que el trabajo ya debe estar en segundo plano para que pueda escribirexit
o presionar Control-D en el símbolo del sistema, no se envían señales de ningún tipo desde bash.Prueba:
Terminal 1
Terminal 2
(cierre la terminal 1, vista en la terminal 2):
Trabajo
doit.sh
:Comience en segundo plano en la Terminal 1:
Terminal 1
Estérelo en la Terminal 2; cierre la Terminal 1 después de un par de bucles:
Terminal 2
Salida en la Terminal 3:
Terminal 3
Sin embargo, si sale
bash
, simplemente sale sin enviar ninguna señal al niño. El terminal saldrá porque ya no tiene un hijo, pero, por supuesto, no hay nadie en HUP porque el shell hijo ya no está. ElSIGINT
,SIG_BLOCK
ySIG_SETMASK
ves a continuación se deben a lasleep
en el shell.Terminal 1
Terminal 2
Terminal 3, salida
Curiosamente, me puse
huponexit
a estar en conshopt -s huponexit; shopt
(este último shopt a revisión), y luego realizó la última prueba, y de nuevo golpe envía ninguna señal al proceso en segundo plano . Aún más interstingly, como hemos visto fiesta hicimos enviar la señal al proceso en segundo plano después de que lo recibió de un terminal que cierra en su cara. Parece quehuponexit
no tenía nada que ver de una forma u otra.Espero que esto elimine cualquier misterio o confusión sobre al menos la alegría de bash, sobre cuándo y cómo se envía la señal HUP. Al menos mis pruebas fueron completamente reproducibles, para mí. Me interesaría saber si hay otras configuraciones que puedan estar afectando el comportamiento de bash.
Y, como siempre, YSMV (su caparazón puede variar).
Anexo 1
Cuando ejecuto un shell como
exec /bin/sh
, luego ejecuto el script como/bin/sh ./doit.sh &
, luego salgo del shell limpiamente, no se envían señales al trabajo en segundo plano y continúa ejecutándose hasta su finalización.Anexo 2
Cuando ejecuto un shell como
exec /bin/csh
, luego ejecuto el script como/bin/sh ./doit.sh &
, luego salgo del shell limpiamente, no se envían señales al trabajo en segundo plano y continúa ejecutándose hasta su finalización.fuente
Uso csh y los procesos en segundo plano continúan ejecutándose cuando finalizo la sesión.
fuente