172 votos

¿Cómo se crean un demonio en Python.

La búsqueda en Google revela x2 fragmentos de código. El primer resultado es este código receta que tiene una gran cantidad de documentación y explicación, junto con algunos útiles de discusión por debajo.

Sin embargo, otro ejemplo de código, mientras no contiene mucha documentación, que incluye código de ejemplo para pasar los comandos, tales como iniciar, detener y reiniciar. También crea un archivo PID que puede ser útil para comprobar si el demonio ya se está ejecutando, etc.

Estas muestras tanto de explicar cómo crear el demonio. Hay cosas adicionales que se deben considerar? Es una muestra mejor que el otro, y ¿por qué?

122voto

bignose Puntos 6573

Hay muchos más incómoda cosas a tener cuidado al convertirse en un buen comportamiento del proceso demonio:

  • prevenir los volcados de núcleo (muchos demonios se ejecutan como root, y volcados de núcleo pueden contener información confidencial)

  • comportarse correctamente dentro de un chroot gaol

  • set UID, GID, directorio de trabajo, umask, y otros parámetros de proceso en forma adecuada para el caso de uso

  • renunciar a elevadas suid, sgid privilegios

  • cierre todos los descriptores de archivo, con las exclusiones según el caso de uso

  • comportarse correctamente si se inicia dentro de un ya-separado de su contexto, tal como init, inetd, etc.

  • configurar controladores de señal para una demonio de comportamiento, pero también con manejadores específicos determinados por el caso de uso

  • redirigir los flujos estándar stdin, stdout, stderr desde un proceso demonio ya no tiene un terminal de control

  • manejar un archivo PID como una cooperativa asesor de bloqueo, que es toda una lata de gusanos en sí mismo, con muchas contradictorias, pero válida maneras de comportarse

  • permitir una limpieza adecuada cuando se termina el proceso

  • en realidad convertirse en un demonio proceso sin llevar a zombies

Algunos de estos son estándar, como se describe en la canónica de Unix literatura (Programación Avanzada en el Entorno UNIX, por la tarde W. Richard Stevens, Addison-Wesley, 1992). Otros, como el flujo de la redirección y PID manejo de archivos, son los convencionales de comportamiento de la mayoría de demonio que los usuarios esperan, pero que son menos estandarizados.

Todos estos son cubiertos por la PEP 3143 "Estándar del proceso demonio de la biblioteca de" la especificación y el python-demonio de la implementación de referencia.

105voto

Jeff Bauer Puntos 6598

Del lijadora Marechal ejemplo de código es superior a la original, que fue publicada originalmente en 2004. Una vez contribuyó un daemonizer para Pyro, pero seguramente usa código de Sander si tuviera que hacerlo otra vez.

67voto

Dustin Kirkland Puntos 1404

Aquí está mi básicas 'Hola Mundo' Python demonio que voy a empezar con, cuando estoy desarrollando un nuevo demonio de la aplicación. Tenga en cuenta que esto depende de python-demonio de la biblioteca, que funciona muy bien en python2, pero es que aún no se admiten en python3.

#!/usr/bin/python
import time
from daemon import runner

class App():
    def __init__(self):
        self.stdin_path = '/dev/null'
        self.stdout_path = '/dev/tty'
        self.stderr_path = '/dev/tty'
        self.pidfile_path =  '/tmp/foo.pid'
        self.pidfile_timeout = 5
    def run(self):
        while True:
            print("Howdy!  Gig'em!  Whoop!")
            time.sleep(10)

app = App()
daemon_runner = runner.DaemonRunner(app)
daemon_runner.do_action()

Tenga en cuenta que tendrá la python-deaemon de biblioteca. En Ubuntu, sería:

sudo apt-get install python-daemon

Entonces sólo tienes que iniciar con ./howdy.py start, y termina con el ./howdy.py stop.

36voto

Viliam Puntos 2219

Nota el python-demonio paquete, lo cual resuelve muchos de los problemas detrás de los demonios fuera de la caja.

Entre otras características permite (desde el paquete de Debian descripción):

  • Separar el proceso en su propio proceso de grupo.
  • Proceso de configuración del entorno apropiado para el funcionamiento en el interior de una jaula chroot.
  • Renunciar a suid y sgid privilegios.
  • Cierre todos los descriptores de archivo.
  • Cambiar el directorio de trabajo, uid, gid, y umask.
  • Establecer los manejadores de señales.
  • Abrir nuevos descriptores de archivo para stdin, stdout, y stderr.
  • Administrar un PID especificado archivo de bloqueo.
  • Registro de limpieza de las funciones de salida de procesamiento.

12voto

Chris Johnson Puntos 2887

Una alternativa, crear un programa Python normal, no daemonized luego daemonize externamente mediante supervisord o una utilidad similar. Esto puede ahorrar muchos dolores de cabeza y es * nix - y lengua-portable.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X