Después de iniciar sesión ssh
, escribo este comando bash
:
sleep 50000000000000 &
Luego, kill -9
el sleep
proceso padre del proceso (es decir, bash
). Entonces la ventana de terminal se desconecta simultáneamente.
Cuando vuelvo a iniciar sesión, encuentro que el sleep
proceso todavía está vivo.
Pregunta : ¿Por qué puede sleep
sobrevivir el proceso cuando salgo y el terminal está cerrado? En mi opinión, todo, excepto los demonios y los nohup
programas, se eliminarán durante el cierre de sesión. Si sleep
puede sobrevivir de esta manera, ¿significa que puedo usar este método en lugar del nohup
comando?
&
bifurcará el proceso en segundo plano (como daemon) y seguirá ejecutándose aunque haya cerrado la sesión.Respuestas:
Tl; dr:
A menos que la
bash
instancia generadassh
tenga lahuponexit
opción establecida, ningún proceso terminará por ningún medio al salir / cerrar sesión, y cuando lahuponexit
opción está configurada, el usokill -9
en el shell no es una buena alternativa al usonohup
en los procesos secundarios del shell;nohup
en los procesos secundarios del shell aún los protegerá de SIGHUPs que no provienen del shell, e incluso cuando eso nonohup
es importante, todavía es preferible porque permite que el shell finalice con gracia.En
bash
hay una opción llamadahuponexit
, que si se establece harábash
SIGHUP sus hijos al salir / cerrar sesión;En las
bash
instancias interactivas sin inicio de sesión , como en unabash
instancia generada porgnome-terminal
, esta opción se ignora; yahuponexit
sea que esté activado o desactivado,bash
los niños nunca serán VISTOSbash
al salir;En instancias de inicio de sesión interactivas
bash
, como en unabash
instancia generada porssh
, esta opción no se ignora (sin embargo, no está activada de forma predeterminada); sihuponexit
está configurado,bash
los hijos de SIGHUP se veránbash
al salir / cerrar sesión; si nohuponexit
está configurado,bash
los hijos de 'SIGHUP' no se veránbash
al salir / cerrar sesión;Por lo tanto, en general, salir / cerrar sesión de una
bash
instancia de inicio de sesión interactiva , a menos que se establezca lahuponexit
opción, no hará que el shell SIGHUP sea secundario, y salir / cerrar sesión de unabash
instancia interactiva sin inicio de sesión no hará que el shell SIGHUP sea secundario sin importar;Sin embargo, esto es irrelevante en este caso: el uso
kill -9
sleep
sobrevivirá independientemente, porque matar su proceso padre (bash
) no dejará una oportunidad para que el último haga nada al primero (es decir, por ejemplo, si labash
instancia actual era unabash
instancia de inicio de sesión yhuponexit
se configuró la opción, SIGHUP it).Además de esto, a diferencia de otras señales (como una señal SIGHUP enviada a
bash
), una señal SIGKILL nunca se propaga a los procesos secundarios de un proceso, porsleep
lo tanto, ni siquiera se elimina;nohup
inicia un proceso inmune a las señales SIGHUP, que es algo diferente; evitará que el proceso se cuelgue al recibir una señal SIGHUP, que en este caso podría ser recibida por labash
instancia de inicio de sesión interactiva en caso de quehuponexit
se estableciera la opción y se cerrara el shell; por lo que, técnicamente, usarnohup
para iniciar un proceso en unabash
instancia de inicio de sesión interactiva con lahuponexit
opción deshabilitada evitará que el proceso se cuelgue al recibir una señal SIGHUP, pero salir / cerrar sesión del shell no lo SIGHUP independientemente;Sin embargo, en general, cuando
nohup
se necesita para evitar que las señales SIGHUP provengan del shell principal, no hay razón para preferir elkill -9
método principal al métodonohup
secundario; en cambio, debería ser lo contrario.Matar al padre usando el
kill -9
método no deja una oportunidad para que el padre salga con gracia, mientras que al comenzar el niño usando elnohup
método permite que el padre sea terminado por otras señales, como SIGHUP (para hacer un ejemplo que tenga sentido en el contexto de un niño comenzó a usarnohup
), lo que le permite salir con gracia.fuente
ps -e | grep process
debe enumerar el proceso junto con el PID (o mejor solopgrep -x process
si está seguro de que coincide con ese proceso único y no con las cosas no desechadas); el problema es que cuando eliminas un proceso en el quekill -9
sus hijos son propiedadupstart
, por lo tanto, su PPID original se pierde y su PPID cambia al PID inicial, lo que los hace irreconocibles (AFAIK) pero por su nombre o PIDnohup
no podrá evitar que un proceso cuelgue al recibir una señal SIGHUP del proceso principal? Estoy tratando de ejecutar un proceso en segundo plano (en un terminal de shell PuTTY SSH) pornohup <command> <arg> &
. Cuando cierre sesión haciendo clic en elX
botón PuTTY , el proceso en segundo plano finalizará de inmediato. Cuando cierre sesión escribiendoexit
en el terminal shell PuTTY SSH, el proceso continuará ejecutándose en segundo plano.bash
de manera predeterminada , no envía la señal HUP a los procesos secundarios al salir . Más en detalle (gracias @kos), nunca lo hace para shells sin inicio de sesión .Puede configurar bash para hacerlo para shells de inicio de sesión si establece la opción
huponexit
. En una terminal, haz:(Esto inicia un nuevo shell de "inicio de sesión")
Ahora verifique el
sleep
proceso:... no se está ejecutando: recibió la señal HUP y salió como se solicitó.
fuente
sleep 1000 & ; exit
lossleep
sobrevive? Tenga en cuenta que sikill -HUP
elsleep
proceso saldrá . E incluso si sehuponexit
establece, elsleep
sobrevive. Confundido ... (Intentaré comprender mejor y modificar la respuesta, de lo contrario lo eliminaré).kill -9
realmente no es el camino por el que uno debería ir. Es como disparar con una pistola al televisor para apagarlo. Además del componente cómico no hay ventaja. Los procesos no pueden atrapar o ignorarSIGKILL
. Si no le da al proceso la oportunidad de terminar lo que está haciendo y limpiar, puede dejar archivos corruptos (u otro estado) y no podrá comenzar de nuevo.kill -9
Es la última esperanza, cuando nada más funciona.Qué sucede en tu caso:
El proceso padre de
sleep
es elbash
shell actualmente en ejecución . Cuando realizakill -9
ese bash, el proceso de bash no tiene la posibilidad de enviar un correo electrónicoSIGHUP
a ninguno de sus procesos secundarios, porqueSIGKILL
(el cual es enviado porkill -9
) no es detectable por el proceso. El proceso de suspensión continúa ejecutándose. dormir ahora se convirtió en un proceso huérfano .El proceso init (PID 1) hace un mecanismo llamado reparenting. Eso significa que el proceso init ahora se convierte en el padre de ese proceso huérfano. init es una excepción, los procesos pueden convertirse en su hijo, ya que recopila procesos que perdieron su proceso padre original. Por cierto: un demonio (como
sshd
) hace eso cuando "va en segundo plano".Si eso no ocurriera, el proceso huérfano se convertiría más tarde (cuando haya terminado) en un proceso zombie. Esto es lo que sucede cuando
waitpid()
no se llama (una responsabilidad del proceso padre que no se puede cumplir cuando se cancela ese proceso). init llamawaitpid()
en un intervalo específico para evitar niños zombies.fuente
TERM
oHUP
huponext
. Y TERM esperará hasta que termine el sueño. En el caso del comando de suspensión de los OP, serían miles de años =)El
&
comienza el proceso en segundo plano. Si escribeps -ef
, verá que la ID de proceso principal (PPID) de su sueño es su bash. Luego cierre sesión y vuelva a iniciar sesión. El proceso seguirá ejecutándose después de cerrar sesión. Después de iniciar sesión por segunda vez,ps -ef
vuelve a ejecutar . Verá que ahora el padre de su proceso de suspensión será procesado con la identificación "1". Es init, el padre de todos los procesos.fuente
El uso
&
hará que el programa se ejecute como fondo. Para ver el programa en segundo plano, use elbg
comando, y para que vuelva a ejecutarse como primer plano, ejecutefg
.Sí, hay muchas maneras de mantener el programa ejecutándose incluso cuando se salga del terminal principal.
fuente
huponexit
solo funciona en shells de inicio de sesión, como un shell obtenido a través dessh
(y no, por ejemplo, en un shell obtenido a través degnome-terminal
)