¿Cuáles son las diferencias entre
$ nohup foo
y
$ foo &
y
$ foo &
$ disown
shell
nohup
job-control
disown
lesmana
fuente
fuente
foo &!
que debería ser igual a rechazarlo desde el principio.foo & disown
para repudiar de inmediato.setsid
, y cómo se relaciona condisown
ynohup
Respuestas:
Primero veamos qué sucede si un programa se inicia desde un shell interactivo (conectado a una terminal) sin
&
(y sin ninguna redirección). Así que supongamos que acabas de escribirfoo
:foo
crea el proceso en ejecución .SIGHUP
, también envía unSIGHUP
al proceso (que normalmente hace que el proceso finalice).Ahora, veamos qué sucede si pones el proceso en segundo plano, es decir, escribe
foo &
:foo
crea el proceso en ejecución .jobs
y se puede acceder usando%n
(donden
está el número de trabajo).fg
, en cuyo caso continúa como si no lo hubiera utilizado&
(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 unSIGHUP
al proceso. Dependiendo del shell y posiblemente de las opciones establecidas para el shell, al terminar el shell también enviará un mensajeSIGHUP
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 enviadoSIGHUP
por el shell). Sin embargo, tenga en cuenta que todavía está conectado al terminal, por lo que si el terminal se destruye (lo que puede suceder si fue una pty, como las creadas porxterm
ossh
, y el programa de control finaliza, cerrando el xterm o finalizando la conexión SSH ) , el programa fallará tan pronto como intente leer desde la entrada estándar o escribir en la salida estándar.Lo que
nohup
sí, 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 no se pierde lo que escriba el proceso.SIGHUP
(de ahí el nombre).Tenga en cuenta que
nohup
no no eliminar el proceso de control de trabajo de la cáscara y también no lo pone en segundo plano (pero desde un planonohup
de trabajo es más o menos inútil, que había por lo general lo puso en el fondo usando&
). Por ejemplo, a diferencia dedisown
, el shell aún le dirá cuándo se ha completado el trabajo de nohup (a menos que el shell finalice 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 del shell, pero aún lo deja conectado al terminal. Uno de los resultados es que el shell no lo enviará aSIGHUP
. 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 salidanohup.out
y lo protegeSIGHUP
. Uno de los efectos (el nombre) es que el proceso no recibirá ninguno enviadoSIGHUP
. 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).fuente
nohup
solo no evita que se cierre un proceso de Google Chrome, cuando se cierra el terminal desde el que se inició .disown %1
ydisown -h %1
? ¿El segundo se mantendrá como un trabajo normal (pero ignora la señal HUP) hasta la salida del terminal?(foo&)
subshellEl uso
&
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 endisown
gran medida no están relacionados; 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 hacenohup
un trabajo cuando comienza, puede usarlodisown
para modificar un trabajo en ejecución; sin argumentos, modifica el trabajo actual, que es el que acaba de establecersefuente
nohup
ydisown
se puede decir que ambos suprimenSIGHUP
, pero de diferentes maneras.nohup
hace que el programa ignore la señal inicialmente (el programa puede cambiar esto).nohup
también trata de hacer arreglos para que el programa no tenga un terminal de control, de modo queSIGHUP
el núcleo no lo envíe cuando el terminal esté cerrado.disown
es puramente interno al caparazón; hace que el shell no se envíeSIGHUP
cuando termina.disown
eliminación del trabajo de la lista de trabajos. Si no especifica una opción, la elimina de la lista de trabajos. Sin embargo , si especifica la-h
opción, cada especificación de trabajo no se elimina de la tabla. En cambio, hace queSIGHUP
no se envíe al trabajo si el shell recibe unSIGHUP
.&
no le da un terminal, se separastdin
del proceso y hace que se ejecute en segundo plano, pero ambosstdout
ystderr
todavía está conectado al tty actual. Esto significa que puede obtener texto de diferentes programas mezclados, lo que puede ser bastante molesto si lo hacegimp &
y obtiene muchos errores GTK + al intentar usar ese tty para otra cosa.Aquí está mi experiencia tratando de ejecutar soffice en segundo plano, siguiendo un comando que no termina (por ejemplo
tail
). Para este ejemplo lo usarésleep 100
.Y
nohup .. &
y repudiar
setsid .. &
Para ahorrar espacio:
nohup setsid ..
: no muestra logs / soffice NO PARA sobre Ctrl-Cnohup
con& disown
al final: no muestra logs / soffice detiene en Ctrl-Cfuente
nohup ⟨command⟩ & disown
el proceso creado no se detieneCtrl+C
.soffice
?soffice
El comando parece tener algo diferente. Así que consideré agregarlo aquí como una excepción de la regla. por ejemplo, cuando se utiliza:nohup .. &
presionarCtrl-c
normalmente no hace que el comando se detenga, perosoffice
sí lo hace. Espero hasta que alguien pise esto y explique por qué sucede esto con soffice :)nohup soffice &
y presionéCtrl+C
. No pasó nada, como se esperaba.