nohup
capta la señal de colgar (ver man 7 signal
) mientras que el ampersand no lo hace (excepto que el shell está configurado de esa manera o no envía SIGHUP
en absoluto).
Normalmente, al ejecutar un comando usando &
y al salir del shell después, el shell finalizará el subcomando con la señal de colgado (kill -SIGHUP <pid>
). Esto se puede prevenir usando nohup
, ya que capta la señal y la ignora para que nunca llegue a la aplicación real.
En caso de que esté usando bash, puede usar el comando shopt | grep hupon
para averiguar si su shell envía SIGHUP a sus procesos secundarios o no. Si está desactivado, los procesos no se terminarán, como parece ser su caso. Puede encontrar más información sobre cómo bash termina las aplicaciones aquí.
Hay casos en los que nohup
no funciona, por ejemplo cuando el proceso que inicias vuelve a conectar el SIGHUP
señal, como es el caso aquí.
myprocess.out &
ejecutaría el proceso en segundo plano usando una subcapa. Si el shell actual finaliza (por ejemplo, al cerrar la sesión), todos los subshells también finalizan, por lo que el proceso en segundo plano también finalizaría. El comando nohup ignora el HUP
señal y, por lo tanto, incluso si el shell actual finaliza, el subshell y myprocess.out
continuaría ejecutándose en segundo plano. Otra diferencia es que &
solo no redirige el stdout/stderr, por lo que si hay algún resultado o error, se muestran en la terminal. nohup, por otro lado, redirige el stdout/stderr a nohup.out
o $HOME/nohup.out
.
La mayoría de las veces iniciamos sesión en el servidor remoto usando ssh. Si inicia un script de shell y cierra la sesión, el proceso se cancela. Nohup ayuda a continuar ejecutando el script en segundo plano incluso después de cerrar la sesión del shell.
Nohup command name &
eg: nohup sh script.sh &
Nohup capta las señales de HUP. Nohup no pone el trabajo automáticamente en segundo plano. Necesitamos decir eso explícitamente usando &