Esta pregunta es antigua, y todavía no tengo claro por qué.
Pregunta original en 2014:
En una pestaña Terminal de Gnome, corrí
$ nohup chromium-browser &
Pero cuando cierro la pestaña del terminal, chromium-browser
también sale. ¿No se nohup
supone que debe evitar eso? Gilles dijo:
Nohup y Disown pueden decirse que suprimen SIGHUP, 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 que el núcleo no lo envíe SIGHUP cuando el terminal esté cerrado. disown es puramente interno al caparazón; hace que el shell no envíe SIGHUP cuando termina.
Entonces, ¿no hace que el navegador de cromo ignore SIGHUP?
También estoy viendo esto en otros ejecutables, como Emacs (modo GUI). Pero no en xeyes.
Esto está sucediendo en Ubuntu 12.04, 32 bits cuando se publicó la pregunta.
Actualización en 2015,
Ahora estoy ejecutando Ubuntu 14.04, en google-chrome
lugar de chromium-browser
instalado. Lo mismo que le sucedió a chromium-browser antes también le sucede a google-chrome ahora. nohup google-chrome 2>/dev/null &
no evita que se cierre cuando la pestaña del terminal está cerrada. /usr/bin/google-chrome
es un enlace a un script bash /opt/google/chrome/google-chrome
. ¿Por qué no se nohup
aplica aplicado al script bash? ¿Cómo podemos hacer que funcione en scripts de bash? ¿Qué pasa con los scripts de Python?
xeyes
.Respuestas:
Cuando cierra una ventana de Terminal de GNOME, se envía un SIGHUP al shell que estaba ejecutando. El shell generalmente enviará un SIGHUP a cada grupo de procesos que sabe que creó, incluso los que comenzaron
nohup
, y luego se cerrará. Si el shell esbash
, omitirá el envío de un SIGHUP a cualquier grupo de procesos con el que el usuario marcódisown
.Ejecutar un comando con
nohup
hace que ignore SIGHUP, pero el proceso puede cambiar eso. Cuando la disposición de SIGHUP para un proceso es la predeterminada, si recibe un SIGHUP, el proceso finalizará.Linux proporciona algunas herramientas para examinar la configuración de la señal de un proceso en ejecución.
El script de shell de chromium-browser realiza una
exec
de las aplicaciones compiladas, por lo que su ID de proceso sigue siendo la misma. Entonces, para ver la configuración de la señal, corrínohup chromium-browser &
y luego miré/proc/$!/status
para ver la disposición de la señal.Esos son números hexadecimales. Esto muestra que SIGHUP no se captura y no se ignora. Solo SIGPIPE (el 13er bit en SigIgn) se ignora. Rastreé esto hasta el siguiente código :
A pesar del comentario, las señales ignoradas por el padre no se ignoran. Un VISTAZO matará el cromo.
La solución es hacer lo que @ xx4h señala: use el
disown
comando en su bash para que, si bash tiene que salir, no envíe SIGHUP alchromium-browser
grupo de procesos. Puede escribir una función para hacer esto:fuente
trap "" 1
, eso haría que el shell (y sus hijos) ignoraran SIGHUP. Aclararé esto.trap
comandos en el contenedor de script de shell no impiden esto, y la ejecuciónnohup
no puede evitarlo. Revisaré mi respuesta para reflejar esto.Si
chromium-browser
se parece a algo asígoogle-chrome
, creo que el problema más probable es quechromium-browser
no lochromium
es, sino que es un envoltorio que inicializa el estado y luegoexec
schromium
.En mi
google-chrome
instalación, el binario se encuentra en realidad/opt/google/chrome
y el contenedor/usr/bin
es solo un script de shell que establece una gran cantidad de entornos relacionados con losxdg-*
valores predeterminados y las rutas absolutas y similares antes de reemplazarse con el binario propiamente dicho.En este punto, cualquier señal que
nohup
podría haber ignorado inicialmente en nombre del script que llamó como su hijo dejará de importar y, a menos que el script de contenedor tenga cuidado de organizarlo de otra manera (lo que no es), el ctty se hereda.Intenta
file /usr/bin/chromium-browser
comprobar si es el shell-script que creo que es. Si es así, considere reescribirlo para que se adapte mejor a usted.Puedo decir que solo hacerlo lo
google-chrome 2>/dev/null &
mantiene abierto para mí, pero no puedo recordar si ese es un resultado probable de las modificaciones que hice al guión: fue hace más de un año.fuente
chromium-browser
antes también sucedegoogle-chrome
ahora. No tengochromium-browser
instaladonohup google-chrome 2>/dev/null &
no evita que se cierre cuando la pestaña del terminal está cerrada.google-chrome
es un script bash/opt/google/chrome/google-chrome
. ¿Por qué nohup aplicado a un script bash no funciona? ¿Cómo podemos hacer que funcione en scripts de bash? ¿Qué pasa con los scripts de Python?chrome
binario.exec
en elchrome
binario actual ? ¿Cómo modifico el script entonces? Aquí está mi/opt/google/chrome/google-chrome
exec -a "$0" "$HERE/chrome" ... || exec -a "$0" "$HERE/chrome"
... En la parte superior$HERE
se establece el valor dereadlink $0
(que es su ruta de instalacióngoogle-chrome
) pero/opt/google/chrome/chrome
es el binario, que es con lo que se reemplaza el script.exec
probablemente. Terminará con un pid extra (más allá de sus otros 1000) y un proceso de shell de espera, pero creo que ese es el alcance de esto. O bien, puede reemplazarexec
connohup
tal vez. Todo depende principalmente de lochrome
que tolerará, pero debería funcionar así.El cromo parece especial.
nohup chromium-browser & disown
debería funcionar en este caso. Ver también: /programming/11421810/nohup-doesnt-work-with-chromiumfuente
nohup chromium-browser &
Por qué no funciona?