Después de iniciar sesión ssh, escribo este comando bash:
sleep 50000000000000 &
Luego, kill -9el sleepproceso padre del proceso (es decir, bash). Entonces la ventana de terminal se desconecta simultáneamente.
Cuando vuelvo a iniciar sesión, encuentro que el sleepproceso todavía está vivo.
Pregunta : ¿Por qué puede sleepsobrevivir el proceso cuando salgo y el terminal está cerrado? En mi opinión, todo, excepto los demonios y los nohupprogramas, se eliminarán durante el cierre de sesión. Si sleeppuede sobrevivir de esta manera, ¿significa que puedo usar este método en lugar del nohupcomando?

&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
bashinstancia generadasshtenga lahuponexitopción establecida, ningún proceso terminará por ningún medio al salir / cerrar sesión, y cuando lahuponexitopción está configurada, el usokill -9en el shell no es una buena alternativa al usonohupen los procesos secundarios del shell;nohupen los procesos secundarios del shell aún los protegerá de SIGHUPs que no provienen del shell, e incluso cuando eso nonohupes importante, todavía es preferible porque permite que el shell finalice con gracia.En
bashhay una opción llamadahuponexit, que si se establece harábashSIGHUP sus hijos al salir / cerrar sesión;En las
bashinstancias interactivas sin inicio de sesión , como en unabashinstancia generada porgnome-terminal, esta opción se ignora; yahuponexitsea que esté activado o desactivado,bashlos niños nunca serán VISTOSbashal salir;En instancias de inicio de sesión interactivas
bash, como en unabashinstancia generada porssh, esta opción no se ignora (sin embargo, no está activada de forma predeterminada); sihuponexitestá configurado,bashlos hijos de SIGHUP se veránbashal salir / cerrar sesión; si nohuponexitestá configurado,bashlos hijos de 'SIGHUP' no se veránbashal salir / cerrar sesión;Por lo tanto, en general, salir / cerrar sesión de una
bashinstancia de inicio de sesión interactiva , a menos que se establezca lahuponexitopción, no hará que el shell SIGHUP sea secundario, y salir / cerrar sesión de unabashinstancia 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 -9sleepsobrevivirá independientemente, porque matar su proceso padre (bash) no dejará una oportunidad para que el último haga nada al primero (es decir, por ejemplo, si labashinstancia actual era unabashinstancia de inicio de sesión yhuponexitse 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, porsleeplo tanto, ni siquiera se elimina;nohupinicia 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 labashinstancia de inicio de sesión interactiva en caso de quehuponexitse estableciera la opción y se cerrara el shell; por lo que, técnicamente, usarnohuppara iniciar un proceso en unabashinstancia de inicio de sesión interactiva con lahuponexitopció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
nohupse necesita para evitar que las señales SIGHUP provengan del shell principal, no hay razón para preferir elkill -9método principal al métodonohupsecundario; en cambio, debería ser lo contrario.Matar al padre usando el
kill -9método no deja una oportunidad para que el padre salga con gracia, mientras que al comenzar el niño usando elnohupmé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 processdebe enumerar el proceso junto con el PID (o mejor solopgrep -x processsi 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 -9sus 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 PIDnohupno 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 elXbotón PuTTY , el proceso en segundo plano finalizará de inmediato. Cuando cierre sesión escribiendoexiten el terminal shell PuTTY SSH, el proceso continuará ejecutándose en segundo plano.bashde 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
sleepproceso:... no se está ejecutando: recibió la señal HUP y salió como se solicitó.
fuente
sleep 1000 & ; exitlossleepsobrevive? Tenga en cuenta que sikill -HUPelsleepproceso saldrá . E incluso si sehuponexitestablece, elsleepsobrevive. Confundido ... (Intentaré comprender mejor y modificar la respuesta, de lo contrario lo eliminaré).kill -9realmente 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 -9Es la última esperanza, cuando nada más funciona.Qué sucede en tu caso:
El proceso padre de
sleepes elbashshell actualmente en ejecución . Cuando realizakill -9ese bash, el proceso de bash no tiene la posibilidad de enviar un correo electrónicoSIGHUPa 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
TERMoHUPhuponext. 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 -efvuelve 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 elbgcomando, 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
huponexitsolo 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)