2010-11-16 21 views
17

Estoy al tanto de algunos (¿todos?) Daemons tenedor cuando se están iniciando. Tengo la impresión de que esto es ejecutar los procesos secundarios como usuarios menos privilegiados, especialmente si el daemon es algo así como un servidor HTTP.¿Por qué los daemons tenedor?

¿Por qué es esto necesario? ¿No podría un proceso iniciar y soltar sus privilegios sin tener que bifurcar un proceso secundario? ¿Es "obligatorio" para bifurcar, o hay alguna otra razón especial (que no sea para ejecutar múltiples procesos de trabajo infantil)?

Soy nuevo en esto y agradecería toda la ayuda que pueda obtener.

Respuesta

19

creo demonios de tenedor por varias razones:

  1. Una de las razones es para separar proceso desde cualquier shell que lo inicia. Algunos proyectiles (Bash, por ejemplo) matan a los niños al salir, a menos que se tomen precauciones especiales específicas para el caparazón. Bifurcar es una forma genérica de evadir esto.

  2. Otra razón es para informar que el daemon se inició correctamente.

    Supongamos que no se bifurca. ¿Cómo sabrías que el daemon se ha iniciado con éxito? No se puede simplemente leer y analizar la salida de daemon, porque los programas de gestión de daemon deberían hacerlo de forma genérica. Entonces, la única forma es obtener el código de retorno del programa.

    De hecho, si un daemon no se inicia (por ejemplo, no puede encontrar el archivo de configuración), lo sabría de inmediato. Pero bueno, si un daemon se ha iniciado con éxito, ¡puede que nunca vuelva! Por lo tanto, su administrador de daemon no puede saber si el daemon todavía está intentando iniciarse, o si se ha iniciado y está funcionando. Fork resolvería el problema, y ​​el programa de bifurcación tendría éxito si un tenedor funcionaba bien.

  3. En cuanto a los privilegios, que abandonen después execve es mucho menos seguro que hacerlo antes de execve. Aquí hay otra razón por la cual el tenedor es útil.

3

Tenía la impresión de que esto se hizo para mantener al daemon completamente desacoplado de cualquier otro proceso (como un shell o similar). Al bifurcar y salir del proceso padre, el proceso de inicio del sistema "adopta" el proceso Huérfano.

3

para respaldar lo daramarak dijo, desde Wikipedia's article:

En un entorno Unix, el proceso padre de un demonio es a menudo (pero no siempre) el proceso init (PID = 1) Los procesos generalmente se convierten en daemons por bifurcando un proceso hijo y luego teniendo su proceso principal saliendo inmediatamente, lo que provoca que init a adopte el proceso hijo. Esta es una vista un tanto simplificada del proceso ya que otras operaciones son generalmente realizadas, como disociando el proceso daemon de cualquier tty controlador. Existen rutinas de comodidad como daemon (3) en algunos sistemas UNIX para ese fin.

Básicamente, el proceso debe desvincularse de otros procesos y de los terminales y tal.

+0

gracias por la copia de seguridad :) – daramarak

7

Los daemons deben doblar dos veces porque deben ser independientes de otros procesos, es decir, no hay manera de matar al daemon matando a otro proceso, y debe estar ejecutándose en segundo plano, que no está conectado a un terminal.

Al iniciarse, el daemon se bifurca y el padre muere. Esto hace que el proceso bifurcado sea un hijo de init, por lo que básicamente es independiente de otros procesos.

En la segunda bifurcación, el niño ya no es un líder de proceso y está separado de la terminal.

Otras buenas prácticas pueden aplicar, leer el código fuente de un daemon simple puede ser perspicaz.

+2

¿Alguna sugerencia de un daemon simple bien escrito para grok? Estaría dispuesto a apostar que hay algunos para evitar ... –

+0

Esta respuesta debe haber sido aceptada, ya que explica el doble bifurcación, que es un concepto muy importante cuando se trata de daemons. – th3an0maly