Si inicio un proceso en segundo plano y luego cierre sesión, ¿continuará ejecutándose?

29

Al preguntar esto después de una discusión prolongada con un compañero de trabajo, realmente me gustaría una aclaración aquí.

Lanzo un proceso en segundo plano, ya sea agregando " &" a la línea de comando o deteniéndolo CTRL-Zy reanudándolo en segundo plano con " bg". Luego me desconecto.

¿Lo que pasa?

Estábamos bastante seguros de que debería haber sido asesinado por un SIGHUP, pero esto no sucedió; Al iniciar sesión nuevamente, el proceso se ejecutó felizmente y pstreemostró que fue "adoptado" por init.

Es este el comportamiento esperado?

Pero entonces, si es así, ¿cuál es el nohuppropósito del comando? Simplemente parece que el proceso no se va a matar de todos modos, con o sin él ...


Editar 1

Algunos detalles más:

  • El comando se inició desde una sesión SSH, no desde la consola física.
  • El comando se lanzó sin nohup y / o &; luego se suspendió con CTRL-Zy se reanudó en segundo plano con bg.
  • La sesión ssh no cayó. Hubo un cierre de sesión real (" exit" comando).
  • El proceso fue una scpoperación de copia de archivos.
  • Al iniciar sesión nuevamente, pstreemostró el proceso ejecutándose y siendo hijo de init.

Editar 2

Para plantear la pregunta más claramente: ¿poner un proceso en segundo plano (usando &o bg) hará que se ignore SIGHUP, tal como lo hace el nohupcomando?


Editar 3

Traté de enviar manualmente un SIGHUPa scp: salió, por lo que definitivamente no ignora la señal.

Luego intenté nuevamente iniciarlo, ponerlo en segundo plano y cerrar sesión: fue "adoptado" inity siguió ejecutándose, y lo encontré allí cuando volví a iniciar sesión.

Estoy bastante perplejo ahora. Parece que no SIGHUPse envió ningún mensaje a lo largo del cierre de sesión.

Massimo
fuente
No vi ninguna mención de E / S de consola allí, lo que también hará que las cosas se tropiecen. ¿Desvió las cosas, es decir, 1>/dev/null 2>&1para bash, etc.?
Avery Payne
No, no lo hice SCP, por supuesto, no requería entrada estándar ... y la salida estándar no parecía ser un problema.
Massimo
Si su shell se ejecuta o no como un shell de inicio de sesión, cambia el rendimiento, que puede ser el caso aquí.
Warner
Hecho algunas otras pruebas; Lo resumí aquí: serverfault.com/questions/117152 .
Massimo

Respuestas:

20

Respuesta encontrada.

Para BASH, esto depende de la huponexitopción de shell, que se puede ver y / o configurar con el shoptcomando incorporado .

Parece que esta opción está desactivada de forma predeterminada, al menos en los sistemas basados ​​en RedHat.

Más información en la página de manual de BASH :

El shell sale por defecto al recibir un SIGHUP. Antes de salir, un shell interactivo reenvía el SIGHUP a todos los trabajos, en ejecución o detenidos. Los trabajos detenidos se envían SIGCONT para garantizar que reciban el SIGHUP. Para evitar que el shell envíe la señal a un trabajo en particular, debe eliminarse de la tabla de trabajos con el mensaje desplegado incorporado (consulte COMANDOS DE CONSTRUIR SHELL a continuación) o marcado para no recibir SIGHUP usando disown -h.

Si la opción de shell huponexit se ha configurado con shopt, bash envía un SIGHUP a todos los trabajos cuando sale un shell de inicio de sesión interactivo.

Massimo
fuente
2
Esa es una estupidez por defecto, pero mis agallas me dicen que es una falla de HR en lugar de bash. Por cierto, con zsh puedes usar &! como un atajo para repudiar, y los procesos bifurcados con y se hacen ver.
Jürgen Strobel
7

Estoy de acuerdo con Warner y solo quiero agregar que puedes evitar que el shell envíe SIGHUP con el comando "disown" incorporado. La página de manual de bash contiene una buena descripción.

Kim
fuente
4

Puede usar el comando nohup para iniciar el comando y redirigir la salida a un archivo de salida nohup. Desde la página de manual de nohup:

nohup - run a command immune to hangups, with output to a non-tty

La otra opción es usar el comando de pantalla . El beneficio de usar la pantalla es que puede volver a conectarse al proceso más adelante.

Jim
fuente
¿Por qué los votos negativos? Usar nohup y screen son formas perfectamente aceptables para evitar matar un proceso al cerrar sesión. Hay otros, pero ambos funcionan. ¿Cual es el trato?
Jim
2
Creo que es un gran punto, pero la Q es sobre por qué sus procesos no se están matando NO "cómo evitar que se maten".
CarpeNoctem
2

Cuando se bifurca un proceso en segundo plano, seguirá siendo el proceso secundario del shell que lo ejecuta.

Todos los procesos secundarios que se ejecutan bajo un shell reciben un SIGHUP al salir. El rendimiento varía ligeramente según la situación exacta, que se detalla detalladamente en la página de manual de bash. Otros proyectiles probablemente tienen descripciones similares.

Apache y otros demonios, normalmente recargan la configuración en SIGHUP. Las utilidades del espacio de usuario a menudo mueren. El rendimiento de la aplicación vinculado a las señales puede ser exclusivo de la aplicación.

Warner
fuente
Entonces el proceso debería haber recibido un SIGHUP en este caso, ¿verdad? Tal vez simplemente lo ignoró, lo comprobaré.
Massimo
Sí exactamente. Eso es lo que creo que es la situación. Si realmente duda del rendimiento documentado, podría hackear un pequeño script para atrapar la señal y registrarla.
Warner
0

¿Cuál fue el proceso? El rendimiento descrito en la publicación anterior 1 fue exacto.

Ciertas funciones y procesos de script pueden atrapar señales. mientras que los bucles pueden escapar como locos.

Ver:

La sesión SSH cae - ¿El comando continúa ejecutándose?

Edición 1 a las 4:22 PM

Desde la página de manual de bash:

The shell exits by default upon receipt of a SIGHUP.   Before  exiting,
an  interactive  shell  resends  the  SIGHUP  to  all  jobs, running or
topped.

La investigación inicial 1 muestra que OpenSSH probablemente ignora SIGHUP, tal vez más señales.

Warner
fuente
Esa publicación realmente me inspiró para hacer la pregunta. Para más detalles, vea editar arriba.
Massimo
2
Las respuestas en el otro hilo hacen que parezca que necesita leer el comando SCP que está usando y ver cómo responde a SIGHUP
mfinni
Y 'nohup' es para comandos que sabes que morirán con un SIGHUP y supongo que no quieres que lo hagan.
mfinni
La página del manual simplemente no lo dice; Intentaré matarlo -HUP mañana ...
Massimo
-1

Si no ejecutó el comando a través de una herramienta como screen, entonces, cuando finaliza la sesión, haga todos los trabajos / tareas asociados con esa sesión.

madriguera
fuente
Eso es exactamente lo que estaba pensando, excepto que ... simplemente no lo hicieron.
Massimo
lo han hecho cada vez que he hecho lo que has descrito ... ¿tal vez depende del shell que uses?
warren
-1 No lo hacen; La respuesta no es tan simple. Acabo de probar un script de shell simple que comencé en segundo plano; se enlazó y envió la salida a un archivo temporal. Siguió funcionando después de que salí de la terminal (como se ve en tail -fel archivo temporal. Esto en una máquina CentOS 7.1 usando bash.
Mike S
@ Mike - por favor demuéstralo. Nunca he sido testigo del comportamiento que describe
warren
@warren - Vea mi respuesta en serverfault.com/questions/117152/… . Tenga en cuenta que varias personas afirman un comportamiento diferente al que usted describe; de hecho, Massimo publicó precisamente porque su proceso continuó.
Mike S