¿Alguien podría explicar si disown
es necesario y por qué si desea mantener un trabajo en ejecución incluso después de desconectarse?
Lo pregunto porque todos los sitios que he visitado dicen que se usen disown
y, bg
por sí bg
solos, funcionan para mí y no estoy seguro de por qué.
¿Es porque no he entendido completamente disown
para qué sirve o hay algunas configuraciones en algún lugar que están afectando el comportamiento predeterminado del bg
comando?
Esto es lo que hice:
- Conectado a mi caja CentOS 6 a través de SSH
Creó un proceso simple:
tar zcvf example.tar.gz ./examplepath > /dev/null 2>&1
suspendido el trabajo
- Lo reanudó en segundo plano a través de
bg 1
- Desconectado del servidor SSH
Luego verifiqué a través de FTP para ver si el .tar.gz
archivo seguía creciendo en tamaño y así fue.
Respuesta1
Los procesos en segundo plano a través de bg
o &
normalmente morirán en 2 escenarios:
- El shell recibe un SIGHUP
- Intentan escribir en una terminal que ya no existe.
El elemento número 1 es el principal culpable al cerrar su terminal. Sin embargo, si sucede o no depende decómoCierras tu terminal. Puedes cerrarlo así:
- Algo así como hacer clic en la "X" en su administrador de ventanas
- Puede escribir
exit
,logout
o CTRL+ D.
El elemento n.º 1 es el que dará lugar al envío de un SIGHUP. #2 no lo hace.
En pocas palabras, si inicia un proceso en segundo plano con bg
y luego cierra la sesión con exit
, logout
o CTRL+ D, el proceso no se finalizará.
Respuesta2
Cuando cierra una terminal, todos los procesos que usan esta terminal (ver TTY
columna en ps -elf
el resultado) reciben un archivo SIGHUP
. Depende de procesar qué hacer SIGHUP
. En Unix clásicos (AIX, Solaris), los procesos se cierran con esta señal. Por eso es necesario utilizar disown
. De man bash
:
El shell se cierra de forma predeterminada al recibir un SIGHUP. Antes de salir, un shell interactivo reenvía SIGHUP a todos los trabajos, en ejecución o detenidos. Los trabajos detenidos se envían SIGCONT para garantizar que reciban 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 disown incorporado (consulte COMANDOS INTEGRADOS DEL SHELL a continuación) o marcarse para que no reciba SIGHUP usando disown -h.