Estoy tratando de comprender la necesidad de utilizar nohup
comandos en segundo plano en ssh. Mi shell es csh en CentOS.
El siguiente comando en segundo plano continúa ejecutándose incluso después de que se cierra ssh. Esperaba que esto solo sucediera si
nohup
estaba anteponiendo el comando.¿Cuál es el escenario donde
nohup
sería necesario?ssh host 'sleep 80 >& /dev/null &'
También probé un shell interactivo y el PID del trabajo en segundo plano todavía existe en el host después de que sale ssh.
ssh host sleep 80 >& /dev/null & exit
También intenté finalizar la sesión interactiva con
kill -HUP PID
en lugar deexit
, y el PID del trabajo en segundo plano todavía existe en el host después de que sale ssh.
¿Algo que estoy haciendo mal?
Respuesta1
No, unfondoEl grupo de procesos (trabajo) NO se elimina de forma predeterminada cuando el líder de la sesión (el shell) sale o cuando se desactiva su terminal de control.
Sólo hay algunos casos especiales en los que esto sucede:
(1)El trabajo de fondo esinterrumpido, en cuyo caso se enviará un SIGHUP
/ SIGCONT
par de señales por parte delnúcleo. Si SIGHUP
un proceso no capta o ignora la señal, el proceso terminará.
La definición de trabajo detenido es: cualquier trabajo que contenga un proceso detenido. Un procesodurmiendoen una llamada al sistema de bloqueo como nanosleep(2)
o read(2)
NO se considera detenida.
(2)Un proceso intenta leer o escribir en el terminal que ya no existe y sale (por su propia voluntad) debido a los errores que obtiene al intentar hacerlo.
(3)El trabajo es en realidad unprimer planotrabajo. Elnúcleoenvía una SIGHUP
señal al grupo de procesos de primer plano cuando finaliza el proceso líder/controlador de sesión (es decir, el shell). El propio proceso de control se señaliza SIGHUP
cuando se desmonta su terminal de control, lo que normalmente provoca su terminación.
Incluso los comandos que comienzan con &
son en realidad parte delprimer planogrupo de procesos cuando se inician desde un shell sin control de trabajo (que en la mayoría de los shells, pero no en csh, es el valor predeterminado cuando se ejecutaguionesysubcapas).
(4)Estás usando un shell como bash
or zsh
, que hace todo lo posible para enviar una SIGHUP
señal a todos sus trabajos cuando él mismo recibe la señal SIGHUP
(según el punto 3 anterior, siendo el shell el proceso de control), o simplemente cuando sale (el este último solo es el predeterminado en zsh
, pero no el predeterminado y sujeto a la shopt huponexit
opción en bash).
Elcáscara csh(ya sea el real csh
o tcsh
)no tiene ese comportamientodesde bash
o zsh
. En tcsh
(pero NO en el real csh
) puede iniciar un comando con el hup
comando incorporado para que se active cuando se cierre el shell:
tcsh% hup sleep 3600 &
tcsh% exit
$ pgrep sleep
[nothing]
(5)Su sistema de inicio hace todo lo posible para limpiar cualquier sesión de usuario finalizada. En su configuración predeterminada,sistemadSeñalará todos los procesos desde unalcanceseguido SIGTERM
de SIGKILL
un retraso, por lo que nohup
NO te ayudará con eso de todos modos. Además, la idea de systemd de unalcanceno coincide con una sesión de proceso Unix, por lo que ejecutar un comando setsid(1)
tampoco permitirá que escape.
Probablemente puedas cambiar el comportamiento de systemd modificando las opciones predeterminadas KillUserProcesses=yes
, KillMode=control-group
y .KillSignal=SIGTERM
SendSIGKILL=yes