¿Por qué algunos programas que se ejecutan desde Terminal usando '&' se cierran cuando Terminal lo hace y otros no?

27

Me preguntaba, por ejemplo, cuando inicio qtoxcon:

qtox &

Y luego cierra Terminal, qtoxcierra con ella. Sin embargo, cuando se ejecuta etherapeusando:

sudo etherape &

Cerrar la Terminal no cierra ni causa ningún problema a Etherape. Y entre diferentes aplicaciones hay diferentes comportamientos, algunos cierran cuando Terminal lo hace, otros no, ¿cómo es que? ¿Por qué algunos cierran cuando otros no? Estoy ejecutando Ubuntu GNOME 15.10 con GNOME 3.18.

kos
fuente
1
¡¿Podría ser que abres una terminal, ejecutas qtox, cierras la terminal, todos ustedes! Pero el segundo va a abrir la terminal, sudo ejecuta etherape, ahora cierra su terminal, pero sudo sigue funcionando hasta que se cierra.
Ken Mollerup
Bueno, si no quieres qtoxsalir cuando cierras el terminal, siempre puedes ejecutarlo nohup qtox &.
Terrance
@Terrance: Bueno, en esta pregunta preguntaba específicamente por qué, no cómo ... Esa sería mi otra pregunta ... :)
1
@ParanoidPanda Ah, buen punto. Mi error. =)
Terrance

Respuestas:

36

Cuando cierra un terminal, el terminal envía una señal SIGHUP al shell; el shell, a su vez, envía una señal SIGHUP a todos sus grupos de procesos secundarios, que incluyen grupos de procesos en segundo plano;

La forma en que cada proceso reaccionará a la señal depende totalmente del proceso: si el proceso no definió un controlador para la señal y le dijo al núcleo (a través de alguna llamada al sistema como signal()osigaction() ) que desea manejarlo, el núcleo se ejecuta El controlador predeterminado para la señal, que en el caso de una señal SIGHUP consiste en terminar el proceso.

Sin embargo, cuando ejecuta un comando con sudo, el UID del sudoproceso y su proceso secundario se establece en 0(root); en general, a menos que el UID del proceso que envía la señal sea 0(raíz) o el mismo que el proceso de destino, el núcleo descarta la señal (es decir: un proceso no puede enviar señales a un proceso propiedad de otro usuario, a menos que el proceso enviar la señal es propiedad de root); Es por eso que un proceso ejecutado por el usuario, como la instancia de Bash ejecutada por el terminal, no puede APROVECHAR un sudoproceso y, en última instancia, cerrar un terminal no afecta un proceso iniciado con sudo.

kos
fuente
77
Y es por eso que necesitamos nohupfrente a esos comandos que cierran con SIGHUP :) Upgoated
Sergiy Kolodyazhnyy
99
Creo que no hay nada mágico sudo. sudosimplemente ejecuta el comando como otro usuario y no puede enviar señal a los procesos de otros usuarios. Ver man 2 kill.
el.pescado
@ el.pescado Entonces, ¿hay sudoalgún tipo de pobre nohup?
Hagen von Eitzen
77
@HagenvonEitzen Si lo desea, pero me gustaría altamente abstengo de ejecutar un comando que no requiere sudode sudopor su nohupefecto secundario, considerado todas las otras desventajas.
kos
2
@Serg que no necesitamos nohup, crea nohup.outarchivos innecesarios después de él. Más bien use el disowncomando incorporado.
Ruslan