¿Cuáles son las diferencias entre
$ Nohup foo
y
$ foo &
y
$ foo &
$ disown
Veamos primero qué sucede si un programa se inicia desde un Shell interactivo (conectado a una terminal) sin &
(y sin ninguna redirección). Asumamos que acabas de escribir foo
:
foo
.SIGHUP
, también envía un SIGHUP
al proceso (que normalmente hace que el proceso finalice).Ahora, veamos qué sucede si coloca el proceso en segundo plano, es decir, escriba foo &
:
foo
.jobs
y se puede acceder usando %n
(donde n
es el número de trabajo).fg
, en cuyo caso continúa como si no hubiera usado &
en él (y si se detuvo debido a intentar leer desde la entrada estándar, ahora puede proceder a leer desde el terminal).SIGHUP
, también envía un SIGHUP
al proceso. Dependiendo del Shell y posiblemente de las opciones establecidas para el Shell, al terminar el Shell también enviará un SIGHUP
al proceso.Ahora disown
elimina el trabajo de la lista de trabajos del Shell, por lo que todos los subpuntos anteriores ya no se aplican (incluido el proceso que el Shell envía un SIGHUP
). Sin embargo, tenga en cuenta que todavía está conectado a la terminal, por lo que si la terminal se destruye (lo que puede suceder si fuera una empanada, como las creadas por xterm
o ssh
, y el programa de control finaliza cerrando el xterm o finalizando SSH conexión), el programa fallará tan pronto como intente leer desde la entrada estándar o escribir en la salida estándar.
Lo que Nohup
hace, por otro lado, es separar efectivamente el proceso del terminal:
EOF
).Nohup.out
, por lo que el programa no fallará al escribir en la salida estándar si el terminal falla, por lo que lo que escribe el proceso no se pierde.SIGHUP
(de ahí el nombre).Tenga en cuenta que Nohup
no no elimina el proceso del control de trabajo de Shell y tampoco lo pone en segundo plano (pero desde el trabajo en primer plano Nohup
es más o menos inútil, generalmente lo pondría en segundo plano usando &
). Por ejemplo, a diferencia de disown
, el Shell aún le dirá cuándo se ha completado el trabajo de Nohup (a menos que el Shell se termine antes, por supuesto).
Entonces para resumir:
&
pone el trabajo en segundo plano, es decir, lo bloquea al intentar leer la entrada y hace que el Shell no espere a que se complete.disown
elimina el proceso del control de trabajo de Shell, pero aún lo deja conectado al terminal. Uno de los resultados es que Shell no le enviará un SIGHUP
. Obviamente, solo se puede aplicar a trabajos en segundo plano, porque no se puede ingresar cuando se está ejecutando un trabajo en primer plano.Nohup
desconecta el proceso del terminal, redirige su salida a Nohup.out
y lo protege de SIGHUP
. Uno de los efectos (el de nomenclatura) es que el proceso no recibirá ningún envío SIGHUP
. Es completamente independiente del control del trabajo y, en principio, podría usarse también para trabajos en primer plano (aunque eso no es muy útil).Utilizando &
hace que el programa se ejecute en segundo plano, por lo que obtendrá un nuevo indicador de Shell en lugar de bloquearlo hasta que finalice el programa. Nohup
y disown
no están relacionados en gran medida; suprimen las señales SIGHUP (colgar) para que el programa no se elimine automáticamente cuando se cierra el terminal de control. Nohup
hace esto cuando el trabajo comienza por primera vez. Si no Nohup
un trabajo cuando comienza, puede usar disown
para modificar un trabajo en ejecución; sin argumentos, modifica el trabajo actual, que es el que acaba de establecerse
Aquí está mi experiencia tratando de ejecutar soffice en segundo plano, siguiendo un comando que no termina (por ejemplo, tail
). Para este ejemplo usaré sleep 100
.
#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100
I ver soffice registros/presionando Ctrl-C soffice se detiene
#!/bin/bash
Nohup /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100
I no veo soffice registros/presionando Ctrl-C soffice se detiene
#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard & disown
sleep 100
I ver soffice registros/presionando Ctrl-C soffice se detiene
#!/bin/bash
setsid /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100
I ver soffice registros/presionando Ctrl-C soffice NO SE DETIENE
Para ahorrar espacio:Nohup setsid ..
: no muestra registros/soffice NO SE DETIENE en Ctrl-CNohup
con & disown
al final: no muestra registros/soffice se detiene en Ctrl-C