Nuestros desarrolladores estrellas agotaron sus depósitos de café, buscando día y noche por la solución, hasta que Alexis halló la respuesta en GitLab así que en este momento la comparte con nosotros.
Solución:
nohup
y disown -h
no son exactamente la misma cosa.
Con disown
, se elimina un proceso de la lista de trabajos en el shell interactivo actual. Correr jobs
después de iniciar un proceso en segundo plano y ejecutar disown
no mostrará ese proceso como un trabajo en el shell. Un trabajo repudiado no recibirá una HUP
del shell cuando sale (pero vea la nota al final).
Con disown -h
el trabajo no se elimina de la lista de trabajos, pero el shell no enviaría un HUP
señalarle si salió (pero vea la nota al final).
los nohup
La utilidad ignora el HUP
señal e inicia la utilidad dada. La utilidad hereda la máscara de señal de nohup
y por lo tanto también ignorará la HUP
señal. Cuando el shell finaliza, el proceso permanece como un proceso secundario de nohup
(y nohup
es re-parentalizado init
).
La diferencia es que el proceso comenzó con nohup
ignora HUP
independientemente de quién envíe la señal. Los procesos repudiados simplemente no son enviado a HUP
señal por la conchapero aún se puede enviar la señal desde, por ejemplo, kill -s HUP
y no ignorará esto.
Tenga en cuenta que HUP
solo se envía a los trabajos de un shell si
- el shell es un shell de inicio de sesión y el
huponexit
la opción de shell está configurada, o - el caparazón mismo recibe un
HUP
señal.
Bits relevantes de la bash
manual (mi énfasis):
SEÑALES
[…]
El shell sale por defecto al recibir un
SIGHUP
. Antes de salir, un shell interactivo reenvía elSIGHUP
a todos los trabajos, en ejecución o detenidos. Los trabajos detenidos se envíanSIGCONT
para asegurarse de que reciben la
SIGHUP
. Para evitar que el shell envíe la señal a un trabajo en particular, debe eliminarse de la tabla de trabajos con ladisown
incorporado (verSHELL BUILTIN COMMANDS
a continuación) o marcado para no recibirSIGHUP
usandodisown -h
.Si el
huponexit
La opción de shell se ha configurado conshopt
,bash
envía un
SIGHUP
a todos los trabajos cuando sale un shell de inicio de sesión interactivo.
disown [-ar] [-h] [jobspec ... | pid ... ]
Sin opciones, elimine cada
jobspec
de la tabla de trabajos activos. […] Si el-h
se da la opción, cadajobspec
es no quitar de la mesa, pero está marcado para queSIGHUP
no se envía al trabajo si el shell recibe unSIGHUP
. […]
Relacionado:
- Diferencia entre nohup, repudiar y &
Ellos son diferentes:
-
disown elimina el trabajo de la tabla de trabajos activos. Luego continúa con el trabajo actual. Con -h el proceso es NO enviado SUSCRÍBETE. En cambio, se deja morir con el caparazón que lo contiene, cuando recibe un SIGHUP.
-
nohup ignora el HUP. Luego, todo lo que se habría pasado a la terminal al cerrar el proceso va a un archivo
nohup.out
.nohup está definido por POSIX mientras que disown no lo está.
Si entiendes que te ha sido útil este post, nos gustaría que lo compartas con el resto juniors y nos ayudes a dar difusión a este contenido.