2010-06-22 4 views
44

Estoy escribiendo un demonio de Linux. Encontré dos formas de hacerlo.Linux daemonize

  1. daemonize el proceso llamando fork() y el establecimiento de sid.
  2. Ejecutando su programa con &.

¿Cuál es la forma correcta de hacerlo?

+1

Puede usar nohup: http://stackoverflow.com/questions/958249/whats-the-difference-between-nohup-and-a-daemon – rogerdpack

Respuesta

76

De http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16

Éstos son los pasos para convertirse en un demonio:

  1. tenedor() por lo que el padre puede salir, esto devuelve el control a la línea de comandos o shell invocando su programa. Este paso es necesario para garantizar que el nuevo proceso no sea un líder del grupo de procesos. El siguiente paso, setsid(), falla si eres un líder de grupo de proceso.
  2. setsid() para convertirse en un grupo de procesos y un líder de grupo de sesión. Dado que una terminal de control está asociada a una sesión, y esta nueva sesión aún no ha adquirido una terminal de control, nuestro proceso ahora no tiene una terminal de control, que es una buena cosa para los daemons.
  3. fork() nuevamente para que el padre, (el líder del grupo de sesión), pueda salir. Esto significa que nosotros, como líderes de un grupo fuera de sesión, nunca podremos recuperar una terminal de control.
  4. chdir ("/") para garantizar que nuestro proceso no mantenga ningún directorio en uso. De lo contrario, podría ocurrir que un administrador no pudiera desmontar un sistema de archivos, porque era nuestro directorio actual. [De manera equivalente, podríamos cambiar a cualquier directorio que contenga archivos importantes para la operación del daemon.]
  5. umask (0) para que tengamos control completo sobre los permisos de todo lo que escribamos. No sabemos qué umask podemos haber heredado. [Este paso es opcional]
  6. close() fds 0, 1 y 2. Esto libera el estándar de entrada, salida y error que heredamos de nuestro proceso principal. No tenemos forma de saber dónde podrían haber sido redirigidos estos fds. Tenga en cuenta que muchos daemons usan sysconf() para determinar el límite _SC_OPEN_MAX. _SC_OPEN_MAX te dice el máximo de archivos/procesos abiertos. Luego, en un bucle, el daemon puede cerrar todos los descriptores de archivos posibles. Debe decidir si necesita hacer esto o no. Si cree que puede haber descriptores de archivos abiertos, debe cerrarlos, ya que existe un límite en el número de descriptores de archivos simultáneos.
  7. Establezca nuevas descripciones abiertas para stdin, stdout y stderr. Incluso si no planea usarlos, sigue siendo una buena idea tenerlos abiertos.El manejo preciso de estos es una cuestión de gusto; si tiene un archivo de registro, por ejemplo, puede desear abrirlo como stdout o stderr, y abrir '/ dev/null' como stdin; alternativamente, puede abrir '/ dev/console' como stderr y/o stdout, y '/ dev/null' como stdin, o cualquier otra combinación que tenga sentido para su daemon en particular.

Mejor aún, a llamar a la función daemon() si está disponible.

+1

tiene que cerrar todos los descriptores abiertos. De lo contrario, los archivos pueden seguir teniendo una referencia, lo que evitará que se eliminen, por ejemplo. Esto es bastante parecido a chdir ("/"). –

+2

@ n-alexanderso - ¿es daemon() doble horquillas? – Dannyboy

+1

Un buen ejemplo en Ruby WEBrick daemonize (fuente de alternancia): http://ruby-doc.org/stdlib-2.1.1/libdoc/webrick/rdoc/WEBrick/Daemon.html –

2

En realidad para hacer un daemon tienes que doblar la horquilla.

Ejecutando el programa con un & hace que el shell ejecute el programa en segundo plano, lo que no lo convierte en un daemon. Los demonios tienen init (pid 1) como padre, por eso se necesita el doble tenedor.

Así que la buena manera de hacer las cosas, si su programa es un daemon, sería ocuparse de este tema usted mismo (hay más métodos, vea here también). También puede usar el programa start-stop-daemon.

5

El primero. El segundo no es daemonizing, pero se ejecuta en segundo plano. Los programas desmembrados deben estar en su propia sesión y grupo de procesos, y deben no tener un terminal de control.

+1

pero aún no puedo entender el uso de la configuración de sesión propia y grupo de proceso – Poorna

2

¿Qué idioma estás usando? Algunos idiomas tienen métodos de ayuda que facilitan la demonización. Por ejemplo, Ruby tiene el paquete daemons.

+0

estamos usando C++ – Poorna

11

Simplemente use daemon(3) (desde unistd.h).

La función daemon() es para programas que deseen desprenderse de la terminal de control y se ejecutan en segundo plano como demonios del sistema. ...

+0

He pasado varios días investigando cómo puedo ejecutar la aplicación del matraz como daemon en ubuntu usando jenkins hasta que vi su consejo. ¡Gracias! Mi problema se resolvió con el comando de shell 'export BUILD_ID = dontKillMe' ' daemon matraz run' – barbarian

28

Sugiero que no escriba su programa como daemon en absoluto. Haga que se ejecute en primer plano con los descriptores de archivo, el directorio actual, el grupo de procesos, etc. que se le asignaron.

Si desea ejecutar este programa como daemon, utilice start-stop-daemon (8), init (8), runsv (desde runit), upstart, systemd o lo que sea para iniciar su proceso como daemon . Es decir, deje que su usuario decida cómo ejecutar su programa y no haga cumplir que debe ejecutarse como daemon.

+6

+1. Por lo menos, ofrece la opción de ejecutar en primer plano. –

+0

Perdón por traer una respuesta anterior, pero ¿Monit también puede iniciar su proceso como daemon? – allaire