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-Z
y 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 pstree
mostró que fue "adoptado" por init
.
Es este el comportamiento esperado?
Pero entonces, si es así, ¿cuál es el nohup
propó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ó conCTRL-Z
y se reanudó en segundo plano conbg
. - La sesión ssh no cayó. Hubo un cierre de sesión real ("
exit
" comando). - El proceso fue una
scp
operación de copia de archivos. - Al iniciar sesión nuevamente,
pstree
mostró el proceso ejecutándose y siendo hijo deinit
.
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 nohup
comando?
Editar 3
Traté de enviar manualmente un SIGHUP
a 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" init
y siguió ejecutándose, y lo encontré allí cuando volví a iniciar sesión.
Estoy bastante perplejo ahora. Parece que no SIGHUP
se envió ningún mensaje a lo largo del cierre de sesión.
fuente
1>/dev/null 2>&1
para bash, etc.?Respuestas:
Respuesta encontrada.
Para BASH, esto depende de la
huponexit
opción de shell, que se puede ver y / o configurar con elshopt
comando 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 :
fuente
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.
fuente
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:
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.
fuente
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.
fuente
¿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:
La investigación inicial 1 muestra que OpenSSH probablemente ignora SIGHUP, tal vez más señales.
fuente
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.fuente
tail -f
el archivo temporal. Esto en una máquina CentOS 7.1 usando bash.