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-browsertambién sale. ¿No se nohupsupone 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-chromelugar de chromium-browserinstalado. 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-chromees un enlace a un script bash /opt/google/chrome/google-chrome. ¿Por qué no se nohupaplica 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
nohuphace 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
execde 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/$!/statuspara 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
disowncomando en su bash para que, si bash tiene que salir, no envíe SIGHUP alchromium-browsergrupo 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.trapcomandos en el contenedor de script de shell no impiden esto, y la ejecuciónnohupno puede evitarlo. Revisaré mi respuesta para reflejar esto.Si
chromium-browserse parece a algo asígoogle-chrome, creo que el problema más probable es quechromium-browserno lochromiumes, sino que es un envoltorio que inicializa el estado y luegoexecschromium.En mi
google-chromeinstalación, el binario se encuentra en realidad/opt/google/chromey el contenedor/usr/bines 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
nohuppodrí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-browsercomprobar 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-browserantes también sucedegoogle-chromeahora. No tengochromium-browserinstaladonohup google-chrome 2>/dev/null &no evita que se cierre cuando la pestaña del terminal está cerrada.google-chromees 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?chromebinario.execen elchromebinario actual ? ¿Cómo modifico el script entonces? Aquí está mi/opt/google/chrome/google-chromeexec -a "$0" "$HERE/chrome" ... || exec -a "$0" "$HERE/chrome"... En la parte superior$HEREse establece el valor dereadlink $0(que es su ruta de instalacióngoogle-chrome) pero/opt/google/chrome/chromees el binario, que es con lo que se reemplaza el script.execprobablemente. 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 reemplazarexecconnohuptal vez. Todo depende principalmente de lochromeque tolerará, pero debería funcionar así.El cromo parece especial.
nohup chromium-browser & disowndebería funcionar en este caso. Ver también: /programming/11421810/nohup-doesnt-work-with-chromiumfuente
nohup chromium-browser &Por qué no funciona?