¿Cuál es la diferencia entre nohup y un daemon?

¿Cuáles son las implicaciones de ejecutar un script como daemon versus usar nohup?

Sé cuál es la diferencia en términos de procesos de bifurcación, etc., pero ¿qué impacto tiene eso en mi script?

El comando nohup es la manera del pobre de ejecutar un proceso como daemon. Como señaló Bruno Ranschaert, cuando ejecuta un comando en un shell interactivo, tiene un terminal de control y recibirá una señal SIGHUP (colgar) cuando el proceso de control (normalmente su shell de inicio de sesión) finalice. El comando nohup ordena que la entrada provenga de /dev/null , y tanto para la salida como para los errores para ir a nohup.out , y para que el progtwig ignore las interrupciones, las señales de salida y las interrupciones. De hecho, todavía tiene el mismo terminal de control, simplemente ignora los controles de los terminales. Tenga en cuenta que si desea que el proceso se ejecute en segundo plano, debe indicarle al shell que lo ejecute en segundo plano, al menos en Solaris (es decir, escriba ‘ nohup sleep 20 & ‘; sin el ampersand, el proceso se ejecuta sincrónicamente en primer plano).

Por lo general, un proceso ejecutado a través de nohup es algo que lleva tiempo, pero que no se queda esperando por la interacción de otro lado.

Típicamente (lo que significa que si se esfuerza, puede encontrar excepciones a estas reglas), un proceso de daemon es algo que acecha en el fondo, desconectado de cualquier terminal, pero esperando responder a algún tipo de entrada. Los daemons de red esperan a que lleguen las solicitudes de conexión o los mensajes UDP a través de la red, hacen el trabajo apropiado y envían una respuesta nuevamente. Piense en un servidor web, por ejemplo, o un DBMS.

Cuando un proceso se demoniza a sí mismo por completo, sigue algunos de los pasos por los que pasa el código nohup ; reorganiza su E / S para que no esté conectada a ningún terminal, se separe del grupo de procesos, ignore las señales apropiadas (lo que puede significar que no ignora ninguna señal, ya que no hay terminal para enviar ninguna de las señales generadas) a través de un terminal). Normalmente, se bifurca una vez y el padre sale exitosamente. El proceso secundario usualmente se bifurca por segunda vez, después de arreglar su grupo de procesos y su ID de sesión, etc. el niño entonces sale también. El proceso de nieta es ahora autónomo y no se mostrará en la salida de ps para la terminal donde se lanzó.

Puede consultar la Progtwigción avanzada en Entorno Unix, 3rd Edn de W Richard Stevens y Stephen A Rago, o en Advanced Unix Programming, 2nd Edn de Marc J. Rochkind para las discusiones sobre daemonización.

Tengo un progtwig de daemonize que daemonize un progtwig que no sabe cómo daemonize (correctamente). Fue escrito para evitar los defectos en un progtwig que se suponía que se daemonizaba a sí mismo pero que no hacía el trabajo correctamente. Contácteme si lo desea – vea mi perfil.

Convertirse en un daemon

Este enlace tiene una buena lista de pasos que debe seguir un proceso para convertirse en un daemon:

https://web.archive.org/web/20120328110436/http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16

No puedo copiar la lista textualmente debido a los derechos de autor (consulte la sección Acerca de), pero aquí está el resumen:

  1. fork (por primera vez) – entonces no somos un líder de grupo, y dejamos que el padre salga.
  2. llame a setsid() – para convertirse en el líder de una nueva sesión. Esta llamada solo funciona si no somos un líder de grupo. Esta nueva sesión no tiene una terminal de control.
  3. fork (segunda vez) – entonces no somos un líder de sesión (y por lo tanto no podemos recuperar un terminal de control), y dejamos que el padre salga.
  4. cd al directorio raíz, por lo que no impedimos que otros directorios sean desinstalados.
  5. configura umask al valor deseado (opcional), porque podríamos haber heredado una máscara que no queríamos.
  6. cierre stdin, stdout, stderr (o simplemente vuelva a abrirlos para apuntar a otro lugar)

nohup

Lo que hace nohup :

  • Si stdout y stderr están conectados a un terminal, los redirecciona a nohup.out
  • ignora SIGHUP

Similitudes y diferencias

Observe cómo las únicas acciones comunes están redirigiendo stdout y stderr. Ser un daemon ni siquiera requiere ignorar SIGHUP.

nohup no requiere que uses ‘ & ‘ para hacer de fondo el proceso, lo que significa que aún puedes usar ctrl-c para enviar SIGINT. El proceso aún responde a la entrada del teclado. Tampoco cambia stdin automáticamente, por lo que se recomienda que lo haga usted mismo a través de ” < /dev/null ".

No confunda nohup con otras características que normalmente se utilizan (p. Ej., Fondo). El OP preguntó específicamente sobre nohup .

En la práctica

En términos prácticos, cuando desee iniciar un proceso prolongado de larga duración que debe continuar cuando el shell salga, querrá usar nohup , pero también querrá combinarlo con el fondo y el redireccionamiento de stdin. No vale la pena crear un daemon en un trabajo de una sola vez, pero algunas de las propiedades de un daemon pueden ser útiles con un trabajo nohup, como " cd / ".

Las tareas periódicas en un progtwig regular se ejecutan mejor a través de cron (u otro progtwigdor).

Los daemons son los más adecuados para supervisar tareas repetidas que no tienen un tiempo de inicio predecible. Normalmente no hay un tiempo de finalización definido para el proceso del daemon (es detenido explícitamente por un usuario / otro proceso o por el cierre del sistema). A menudo los daemons son servicios que responden a aplicaciones (clientes) u otras condiciones (por ejemplo, datos entrantes a través de un dispositivo IO a través de la selección de Unix ()). Otros daemons sondean una condición y realizan una acción en respuesta.

Adición sobre el control de la terminal

Vea esta página . Un resumen rápido es que un terminal controlador otorga acceso ilimitado a su stdin, stdout, stderr. Solo un grupo de proceso puede tener acceso a stdin. Por defecto, los grupos de procesos en segundo plano también pueden escribir en stdout y stderr.

Además, parece que las señales de teclado enviadas a un terminal solo se envían al grupo de procesos que lo tiene como terminal de control.

En las variantes de UNIX, un proceso está asociado con un proceso de terminal (shell de inicio de sesión). Entonces, cuando el proceso terminal finaliza, el proceso también se detiene debido a esta asociación. El nohup evita que un proceso salga cuando el terminal se detiene.

Un daemon o demonio es un proceso que el sistema inicia cuando se inicia, se ejecuta hasta el apagado, ningún usuario lo solicita explícitamente. Entonces, por definición, no es parte de una interacción del usuario sino que pertenece al sistema.

Si tiene acceso al sistema como usuario, puede usar nohup. Si es administrador de sistemas, puede instalar un proceso deamon. Para el proceso, no importa.

Un daemon no se puede iniciar, mientras que nohup es iniciado por el usuario.