¿Cuáles son las diferencias entre
$ nohup foo
y
$ foo &
y
$ foo &
$ disown
fuente
¿Cuáles son las diferencias entre
$ nohup foo
y
$ foo &
y
$ foo &
$ disown
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 escribir foo:
foocrea el proceso en ejecución .SIGHUP, también envía un SIGHUPal proceso (que normalmente hace que el proceso finalice).Ahora, veamos qué sucede si pones el proceso en segundo plano, es decir, escribe foo &:
foocrea el proceso en ejecución .jobsy se puede acceder usando %n(donde nestá 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 un SIGHUPal proceso. Dependiendo del shell y posiblemente de las opciones establecidas para el shell, al terminar el shell también enviará un mensaje SIGHUPal proceso.Ahora disownelimina el trabajo de la lista de trabajos del shell, por lo que todos los subpuntos anteriores ya no se aplican (incluido el proceso enviado SIGHUPpor 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 por xtermo ssh, 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 nohupsí, 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 nohupno no eliminar el proceso de control de trabajo de la cáscara y también no lo pone en segundo plano (pero desde un plano nohupde trabajo es más o menos inútil, que había por lo general lo puso en el fondo 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 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.disownelimina 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á a 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.nohupdesconecta el proceso del terminal, redirige su salida nohup.outy lo protege SIGHUP. Uno de los efectos (el nombre) es que el proceso no recibirá ninguno enviado 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).nohupsolo no evita que se cierre un proceso de Google Chrome, cuando se cierra el terminal desde el que se inició .
disown %1y disown -h %1? ¿El segundo se mantendrá como un trabajo normal (pero ignora la señal HUP) hasta la salida del terminal?
(foo&)subshell
El 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. nohupy en disowngran 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. nohuphace esto cuando el trabajo comienza por primera vez. Si no hace nohupun trabajo cuando comienza, puede usarlo disownpara modificar un trabajo en ejecución; sin argumentos, modifica el trabajo actual, que es el que acaba de establecerse
nohupy disownse puede decir que ambos suprimen SIGHUP, pero de diferentes maneras. nohuphace que el programa ignore la señal inicialmente (el programa puede cambiar esto). nohuptambién trata de hacer arreglos para que el programa no tenga un terminal de control, de modo que SIGHUPel núcleo no lo envíe cuando el terminal esté cerrado. disownes puramente interno al caparazón; hace que el shell no se envíe SIGHUPcuando termina.
disowneliminació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 -hopción, cada especificación de trabajo no se elimina de la tabla. En cambio, hace que SIGHUPno se envíe al trabajo si el shell recibe un SIGHUP.
&no le da un terminal, se separa stdindel proceso y hace que se ejecute en segundo plano, pero ambos stdouty stderrtodavía está conectado al tty actual. Esto significa que puede obtener texto de diferentes programas mezclados, lo que puede ser bastante molesto si lo hace gimp &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.
#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100
I veo soffice logs / pulsando Ctrl- Cparadas soffice
#!/bin/bash
nohup /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100
No veo registros de soffice / presionando Ctrl- Csoffice se detiene
#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard & disown
sleep 100
I veo soffice logs / pulsando Ctrl- Cparadas soffice
#!/bin/bash
setsid /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100
Me veo soffice troncos / pulsando Ctrl- Csoffice no se detiene
Para ahorrar espacio:
nohup setsid ..: no muestra logs / soffice NO PARA sobre Ctrl-C
nohup con & disownal final: no muestra logs / soffice detiene en Ctrl-C
nohup ⟨command⟩ & disownel proceso creado no se detiene Ctrl+C.
soffice? sofficeEl comando parece tener algo diferente. Así que consideré agregarlo aquí como una excepción de la regla. por ejemplo, cuando se utiliza: nohup .. &presionar Ctrl-cnormalmente no hace que el comando se detenga, pero sofficesí 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.
foo &!que debería ser igual a rechazarlo desde el principio.foo & disownpara repudiar de inmediato.setsid, y cómo se relaciona condisownynohup