Primero, esta pregunta está relacionada, pero definitivamente no es lo mismo que esta muy buena pregunta:
Diferencia entre nohup, disown y &
Quiero entender algo: cuando hago '&', me estoy bifurcando, ¿verdad?
¿Alguna vez es útil hacer "nohup ... &" o es simple y suficiente?
¿Alguien podría mostrar un caso en el que estaría usando '&' y todavía querría usar 'nohup'?

nohuphace. ¿Qué parte has confundido?Respuestas:
En primer lugar, cada vez que ejecutas un comando, tu shell bifurcará un nuevo proceso, independientemente de si lo ejecutas
&o no.&solo significa que lo estás ejecutando en segundo plano.Tenga en cuenta que esto no es muy preciso. Algunos comandos, como
cdson funciones de shell, no suelen bifurcar un nuevo proceso.type cmdgeneralmente le dirá sicmdes un comando externo o una función de shell.type typete dice quetypesí es una función de shell.nohupEs algo diferente. Le dice al nuevo proceso que ignoreSIGHUP. Es la señal enviada por el núcleo cuando se cierra el shell principal.Para responder a su pregunta, haga lo siguiente:
emacs &(por defecto debe ejecutarse en una ventana X separada) .exit.Notarás que la
emacsventana se cierra, a pesar de ejecutarse en segundo plano. Este es el comportamiento predeterminado ynohupse usa precisamente para modificarlo.Ejecutar un trabajo en segundo plano (con
&obg, apuesto a que otros shells también tienen otras sintaxis) es una característica de shell, derivada de la capacidad de los sistemas modernos para realizar múltiples tareas. En lugar de bifurcar una nueva instancia de shell para cada programa que desea iniciar, conchas modernas (bash,zsh,ksh, ...) tendrá la posibilidad de gestionar una lista de programas (o trabajos ). Solo uno de ellos a la vez puede estar en primer plano , lo que significa que obtiene el foco de shell. Desearía que alguien pudiera ampliar más las diferencias entre un proceso que se ejecuta en primer plano y uno en segundo plano (el principal es el acceso astdin/stdout).En cualquier caso, esto no afecta la forma en que reacciona el proceso secundario
SIGHUP.nohuphace.fuente
SIGHUPa sus procesos hijos cuando el shell recibeSIGHUP, no cuando el shell sale normalmente. bash tiene una opciónhuponexitque hace que se envíeSIGHUPa los niños cuando sale, pero no está habilitada de manera predeterminada. gnu.org/software/bash/manual/bashref.html#Signals&y cerré mi shell ejecutandoexit. El proceso aún se está ejecutando. ¿Alguna idea de por qué no ha sido asesinado? ¿O me estoy perdiendo algo aquí?¿Alguna vez es útil hacer
nohup ... &? Sí. Si solo comienza un proceso "en segundo plano" con&, ese nuevo proceso todavía tiene membresía en el "grupo de procesos" del shell original. Si ese shell o el grupo de proceso recibe ciertas señales (SIGHUP, por ejemplo), por defecto salen. Esto significa que si ejecuta un proceso&desde un shell iniciado por un xterm, o rxvt o algún otro emulador de terminal de ventanas, cuando cierra la ventana, el proceso en segundo plano obtiene un SIGHUP. La mayoría de los códigos escritos casualmente no manejan SIGHUP y, por lo tanto, salen.Si lo hace
nohup ... &, elnohupcomando configura SIGHUP como ignorado y luego ejecuta el comando. Ese comando recién ejecutado mantiene la máscara de señal que senohupconfiguró, a menos que el comando maneje algunas señales por sí mismo. Si cierra xterm o rxvt o lo que sea, el núcleo entrega SIGHUP al proceso del comando, que se ignora. Se sigue corriendo.Hacer un
nohupcomando le permite seguir ejecutándose después de cerrar xterm o cerrar sesión.fuente
&withnohupmantiene el comando ejecutándose en ciertos casos en los que solo usarnohupno lo haría? Eso parece estar en conflicto con la respuesta aquí: unix.stackexchange.com/a/288064/1822nohuphace algunas cosas antes de laexec()llamada al sistema para que el proceso de horquilla ignorar ciertas señales. Entonces, sí, un "&" permitirá que se ejecute un comando bajo ciertas circunstancias que un viejonohupno lo haría. Como cerrar el xterm asociado con el shell que hizo el nohup, o cerrar sesión.si ejecuta un programa en segundo plano (con & como sufijo) en el sistema operativo Linux y cierra sesión incluso después de eso, seguirá ejecutándose: pruebe con:
Después de volver a iniciar sesión, verifique el número de líneas en el archivo de salida
ping_resultque seguirá aumentando significa que todavía se está ejecutando, sin embargo, se le ha dicho que se cerrará. entonces, ¿para qué sirve elnohupcomando?otro escenario ==> como se indicó anteriormente para
nohup emac &-> que debería seguiremacejecutándose después del cierre de sesión del sistema pero no muestra la ejecución después de volver a iniciar sesión.fuente