2009-06-05 13 views

Respuesta

64

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.

+11

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. –

+0

@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

+4

@ 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. –

6

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.

+0

+1 Me corresponde a corregir. Mezclado entre daemon y un proceso en segundo plano (&). :) – pugmarx

+1

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. –

+5

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

-1

No se puede iniciar un daemon, mientras que nohup es iniciado por el usuario.

36

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:

  1. fork (primera vez) - por lo que no somos un líder del grupo, y dejamos que la salida de los padres.
  2. llamada 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) - 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.
  4. cd al directorio raíz, por lo que no impedimos que otros directorios sean desinstalados.
  5. establece umask al valor deseado (opcional) - porque podríamos haber heredado una máscara que no queríamos.
  6. cerca de la entrada estándar, stdout, stderr (o simplemente abrir de nuevo para que apunten a otra parte)

nohup

Lo nohup hace:

  • Si stdout y stderr se conectan a un terminal , los redirige a nohup.out
  • ignora SIGHUP

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.

+0

Su enlace steve.org.uk está roto. – QED

Cuestiones relacionadas