Saltar al contenido

¿`disown -h` y `nohup` funcionan de la misma manera?

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 -hel 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 el SIGHUP a todos los trabajos, en ejecución o detenidos. Los trabajos detenidos se envían SIGCONT 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 la disown incorporado (ver SHELL BUILTIN COMMANDS a continuación) o marcado para no recibir SIGHUP
usando disown -h.

Si el huponexit La opción de shell se ha configurado con shopt, 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, cada jobspec es no quitar de la mesa, pero está marcado para que SIGHUP no se envía al trabajo si el shell recibe un SIGHUP. […]

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *