it-swarm-es.tech

Diferencia entre Nohup, Disown y &

¿Cuáles son las diferencias entre

$ Nohup foo

y

$ foo &

y

$ foo & 
$ disown
600
lesmana

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:

  • Se crea el proceso que ejecuta foo.
  • El proceso hereda stdin, stdout y stderr del Shell. Por lo tanto, también está conectado a la misma terminal.
  • Si el Shell recibe un SIGHUP, también envía un SIGHUP al proceso (que normalmente hace que el proceso finalice).
  • De lo contrario, el Shell espera (se bloquea) hasta que finalice el proceso.

Ahora, veamos qué sucede si coloca el proceso en segundo plano, es decir, escriba foo &:

  • Se crea el proceso que ejecuta foo.
  • El proceso hereda stdout/stderr del Shell (por lo que aún escribe en el terminal).
  • En principio, el proceso también hereda stdin, pero tan pronto como intenta leer desde stdin, se detiene.
  • Se incluye en la lista de trabajos en segundo plano que administra Shell, lo que significa especialmente:
    • Está listado con jobs y se puede acceder usando %n (donde n es el número de trabajo).
    • Se puede convertir en un trabajo en primer plano usando 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).
    • Si el Shell recibió un 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:

  • Cierra la entrada estándar (el programa no podrá leer ninguna entrada, incluso si se ejecuta en primer plano. No se detiene, pero sí recibir un código de error o EOF).
  • Redirige la salida estándar y el error estándar al archivo 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.
  • Impide que el proceso reciba un 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).
595
celtschk

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

174
Michael Mrozek

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.

Y

#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100

I ver soffice registros/presionando Ctrl-C soffice se detiene

Nohup .. &

#!/bin/bash
Nohup /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100

I no veo soffice registros/presionando Ctrl-C soffice se detiene

y repudiar

#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard & disown
sleep 100

I ver soffice registros/presionando Ctrl-C soffice se detiene

setsid .. &

#!/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-C
Nohup con & disown al final: no muestra registros/soffice se detiene en Ctrl-C

9
Marinos An