traduccion - linux daemon writing howto
Linux daemonize (6)
Estoy escribiendo un demonio de Linux. Encontré dos formas de hacerlo.
- Daemonize su proceso llamando a
fork()
y estableciendosid
. - Ejecutando su programa con
&
.
¿Cuál es la forma correcta de hacerlo?
De http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16
Estos son los pasos para convertirse en un daemon:
- fork () para que el padre pueda salir, esto devuelve el control a la línea de comando o shell que invoca 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.
- 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.
- 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.
- 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. [Equivalentemente, podríamos cambiar a cualquier directorio que contenga archivos importantes para la operación del daemon.]
- umask (0) para que tengamos control total sobre los permisos de todo lo que escribimos. No sabemos qué umask podemos haber heredado. [Este paso es opcional]
- 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.
- 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, simplemente llame a la función daemon() si está disponible.
El primero. El segundo no es daemonizing, pero se ejecuta en segundo plano. Los programas desmembrados deberían estar en su propia sesión y grupo de procesos, y no deberían tener un terminal de control.
En realidad, para hacer un daemon debes doble fork.
Ejecutar 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.
Entonces, la buena manera de hacer las cosas, si tu programa es un daemon, sería encargarte tú mismo de este problema (hay más métodos, mira here también). También puede usar el programa start-stop-daemon.
Qué idioma estás usando? Algunos idiomas tienen métodos de ayuda que facilitan la demonización. Por ejemplo, Ruby tiene el paquete de daemons .
Solo usa daemon(3)
(de unistd.h
).
La función daemon () es para programas que desean desprenderse del terminal de control y ejecutarlos en segundo plano como daemons del sistema. ...
Sugiero no escribir tu 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, use 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.