¿Cuáles son las implicaciones de ejecutar un script como daemon versus usar nohup?¿Cuál es la diferencia entre nohup y un daemon?
Sé cuál es la diferencia en términos de procesos de bifurcación, etc., pero ¿qué impacto tiene eso en mi script?
¿Cuáles son las implicaciones de ejecutar un script como daemon versus usar nohup?¿Cuál es la diferencia entre nohup y un daemon?
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
hace que la entrada provenga del /dev/null
, y para la salida y los errores para ir a nohup.out
, y para que el programa ignore las interrupciones, las señales de abandono 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 símbolo &, el proceso se ejecuta de forma síncrona en el primer plano).
Normalmente, 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.
Normalmente (lo que significa que si lo intentas a fondo, puedes encontrar excepciones a estas reglas), un proceso daemon es algo que acecha en el fondo, desconectado de cualquier terminal, pero esperando responder a alguna entrada de algún tipo. 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 completamente a sí mismo, sigue algunos de los pasos que realiza 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 ahora es autónomo y no se mostrará en la salida ps
para la terminal donde se lanzó.
Puedes mirar Advanced Programming in the Unix Environment, 3rd Edn por W Richard Stevens y Stephen A Rago, o en Advanced Unix Programming, 2nd Edn por Marc J Rochkind para discusiones sobre daemonización.
Tengo un programa daemonize
que daemonize un programa que no sabe cómo daemonize (correctamente). Fue escrito para evitar los defectos en un programa 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.
En las variantes de UNIX, un proceso está asociado a 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 solicitó 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.
+1 Me corresponde a corregir. Mezclado entre daemon y un proceso en segundo plano (&). :) – pugmarx
Casi a la derecha. Cuando un proceso de control (líder de grupo) sale de todos los procesos en el grupo, se envía SIGHUP seguido opcionalmente por SIGCONT. –
Algunas correcciones: Un daemon no necesita ser un proceso del sistema; un usuario sin privilegios puede ejecutar un daemon. Un usuario puede interactuar con un daemon, pero no a través de señales de terminal y flujos de IO (piense en el servidor web). Los daemons se pueden iniciar casi en cualquier momento; no están restringidos al arranque del sistema. – Kelvin
No se puede iniciar un daemon, mientras que nohup es iniciado por el usuario.
convertirse en un demonio de
Este enlace tiene una buena lista de pasos de un proceso debe tomar en convertirse en un demonio: http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16
No puedo copiar textualmente la lista debido a los derechos de autor (véase el Acerca de la sección), pero aquí está el resumen:
fork
(primera vez) - por lo que no somos un líder del grupo, y dejamos que la salida de los padres.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.fork
(segunda vez) - así que 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.cd
al directorio raíz, por lo que no impedimos que otros directorios sean desinstalados.umask
al valor deseado (opcional) - porque podríamos haber heredado una máscara que no queríamos.nohup
Lo nohup
hace:
nohup.out
Similitudes y diferencias
Note como las únicas acciones comunes a redirigir stdout y stderr. Ser un daemon ni siquiera requiere ignorar SIGHUP.
nohup
no es necesario que use '&
' para hacer de fondo el proceso, lo que significa que todavía puede 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 se utilizan normalmente con este (por ejemplo, formación de fondo). El OP preguntó específicamente sobre nohup
.
En la práctica
En términos prácticos, cuando se quiere iniciar un proceso de larga ejecución de una sola vez que debe seguir cuando se cierra la concha, querrá utilizar nohup
, pero usted también quiero combinarlo con fondos y redirigir 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 programa regular se ejecutan mejor a través de cron
(o de algún otro planificador).
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.
Addendum sobre el control de la terminal
Ver this page. 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.
Su enlace steve.org.uk está roto. – QED
No estoy seguro de por qué lo llamas pobre. Hace lo correcto si quiere que su proceso sea un daemon, además de que no se desconecta de la terminal de control, que en la práctica no importa. En segundo lugar, lo está llamando incorrecto, la forma correcta es '(nohup sleep 20 &)', es decir, los parens lo desconectan del líder del grupo de procesos, de modo que no recibe señales para ese grupo de procesos. –
@MaximYegorushkin Los parens no hacen ninguna diferencia (hasta donde puedo ver). Ejecutar cualquier programa desde un shell siempre lo convierte en un líder de grupo. Intenta esto y verás que el PGID siempre coincide con el PID: sistema 'perl-e '" ps -fjp $$ "''. Además, el ampersand no es inherente a nohup, por lo que incluso esa es una diferencia entre nohup y daemon. Voy a agregar mi propia respuesta con aún más diferencias. – Kelvin
@ Kelvin: Los paréntesis en '(nohup sleep 20 &)' hacen la diferencia. Especifican un subconjunto. Dentro del subconjunto, el comando 'nohup' ejecuta el comando' sleep' en el fondo. Cuando vuelve, el subconjunto sale, por lo que el 'sueño 'queda huérfano, ya no es' propiedad 'del caparazón actual. –