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'?
nohup
hace. ¿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
cd
son funciones de shell, no suelen bifurcar un nuevo proceso.type cmd
generalmente le dirá sicmd
es un comando externo o una función de shell.type type
te dice quetype
sí es una función de shell.nohup
Es 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
emacs
ventana se cierra, a pesar de ejecutarse en segundo plano. Este es el comportamiento predeterminado ynohup
se 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
.nohup
hace.fuente
SIGHUP
a sus procesos hijos cuando el shell recibeSIGHUP
, no cuando el shell sale normalmente. bash tiene una opciónhuponexit
que hace que se envíeSIGHUP
a 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 ... &
, elnohup
comando configura SIGHUP como ignorado y luego ejecuta el comando. Ese comando recién ejecutado mantiene la máscara de señal que senohup
configuró, 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
nohup
comando le permite seguir ejecutándose después de cerrar xterm o cerrar sesión.fuente
&
withnohup
mantiene el comando ejecutándose en ciertos casos en los que solo usarnohup
no lo haría? Eso parece estar en conflicto con la respuesta aquí: unix.stackexchange.com/a/288064/1822nohup
hace 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 viejonohup
no 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_result
que seguirá aumentando significa que todavía se está ejecutando, sin embargo, se le ha dicho que se cerrará. entonces, ¿para qué sirve elnohup
comando?otro escenario ==> como se indicó anteriormente para
nohup emac &
-> que debería seguiremac
ejecutá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