Pregunta

Tengo una herramienta que he escrito en Python y por lo general se debe ejecutar como un demonio. ¿Cuáles son las mejores prácticas para el envasado de esta herramienta para su distribución, en particular, cómo se deben manejar los archivos de configuración y el demonio ejecutable / script?

En relación con esto ¿hay herramientas comunes para configurar el demonio para que se ejecutan en el arranque como apropiados para la plataforma dada (es decir, init secuencias de comandos en Linux, servicios en las ventanas, launchd en OS X)?

¿Fue útil?

Solución

Para responder a una parte de su pregunta, no existen herramientas que conozco que va a hacer la configuración demonio de forma portátil incluso a través de los sistemas Linux de Windows permiten por sí solos o Mac OS X.

La mayoría de las distribuciones de Linux parecen estar usando start-stop-daemon dentro de scripts de inicio ahora, pero todavía van a tener menor diferencia en la disposición del sistema de ficheros y grandes diferencias de empaquetado. El uso de autotools / configurar o distutils / easy_install si su proyecto es todo Python, que recorrer un largo camino para hacer que sea más fácil para construir paquetes para diferentes distribuciones de Linux / BSD.

Windows es un juego totalmente diferente y requerirá extensiones Win32 de Mark Hammond y tal vez WMI de Tim Golden extensiones.

No sé Launchd excepto que "ninguna de las anteriores" son relevantes.

Para obtener consejos sobre daemonizing scripts de Python, me gustaría ver a aplicaciones Python que en realidad lo están haciendo en el mundo real, por ejemplo dentro de trenzado.

Otros consejos

La mejor herramienta que encontré para ayudar con los scripts init.d es "start-stop-daemon". Se ejecutará cualquier aplicación, ejecución monitor de archivos / PID, crearlos cuando sea necesario, proporcionar formas de detener el demonio, ID de proceso de configuración de usuario / grupo, e incluso puede fondo su proceso.

Por ejemplo, este es un script que puede iniciar / detener un servidor WSGI:

#! /bin/bash

case "$1" in
  start)
    echo "Starting server"

    # Activate the virtual environment
    . /home/ali/wer-gcms/g-env/bin/activate

    # Run start-stop-daemon, the $DAEMON variable contains the path to the
    # application to run
    start-stop-daemon --start --pidfile $WSGI_PIDFILE \
        --user www-data --group www-data \
        --chuid www-data \
        --exec "$DAEMON"
    ;;
  stop)
    echo "Stopping WSGI Application"

    # Start-stop daemon can also stop the application by sending sig 15
    # (configurable) to the process id contained in the run/pid file
    start-stop-daemon --stop --pidfile $WSGI_PIDFILE --verbose
    ;;
  *)
    # Refuse to do other stuff
    echo "Usage: /etc/init.d/wsgi-application.sh {start|stop}"
    exit 1
    ;;
esac

exit 0

También puede ver que hay un ejemplo de cómo usarlo con un virtualenv, que siempre recomendaría.

Hay muchos fragmentos de la oferta de Internet para escribir un demonio en Python puro (no scripts Bash)

http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python / se ve limpio ...

Si desea escribir su propia,
el principio es el mismo que con la función de golpe daemon.

Básicamente:

En el arranque:

  • desembolsar a otro proceso
  • abrir un archivo de registro para redirigir su stdout y stderr
  • Guardar el pid en alguna parte.

En la parada:

  • Usted envía SIGTERM al proceso con pid almacenada en su pidfile.
  • Con signal.signal (signal.SIGTERM, sigtermhandler) se puede unir una parada procedimiento para la señal SIGTERM.

No sé cualquier paquete ampliamente utilizada hacer esto sin embargo.

Comprobar módulo de daemon del Ben Finney. Ha comenzado a escribir una 3.X pitón PEP de orientación:

http://www.python.org/dev/peps/pep-3143 /

Sin embargo, una aplicación ya está disponible aquí:

http://pypi.python.org/pypi/python-daemon/

No es una bala de plata para lo que estás pidiendo, pero echa un vistazo a supervisord . Maneja todos los bits de la diversión de los procesos de gestión. Yo lo uso mucho en un entorno de producción de gran tamaño. Además, está escrito en Python!

No puedo recordar donde he descargado ... pero este es el mejor guión daemonizing que he encontrado. Funciona muy bien (en Mac y Linux.) (Guardarlo como daemonize.py)

import sys, os
def daemonize (stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
    # Perform first fork.
    try:
        pid = os.fork( )
        if pid > 0:
            sys.exit(0) # Exit first parent.
    except OSError, e:
        sys.stderr.write("fork #1 failed: (%d) %sn" % (e.errno, e.strerror))
        sys.exit(1)
    # Decouple from parent environment.
    os.chdir("/")
    os.umask(0)
    os.setsid( )
    # Perform second fork.
    try:
        pid = os.fork( )
        if pid > 0:
            sys.exit(0) # Exit second parent.
    except OSError, e:
        sys.stderr.write("fork #2 failed: (%d) %sn" % (e.errno, e.strerror))
        sys.exit(1)
    # The process is now daemonized, redirect standard file descriptors.
    for f in sys.stdout, sys.stderr: f.flush( )
    si = file(stdin, 'r')
    so = file(stdout, 'a+')
    se = file(stderr, 'a+', 0)
    os.dup2(si.fileno( ), sys.stdin.fileno( ))
    os.dup2(so.fileno( ), sys.stdout.fileno( ))
    os.dup2(se.fileno( ), sys.stderr.fileno( ))

En su guión, sólo tendría que:

from daemonize import daemonize
daemonize()

Y también puede especificar lugares para redirigir la stdio, err, etc ...

En los sistemas Linux, el administrador del sistema de paquetes (Portage para Gentoo, Aptitud para Ubuntu / Debian, yum en Fedora, etc.) tarda generalmente encarga de instalar el programa, incluyendo la colocación de los scripts de inicio en los lugares correctos. Si quiere distribuir su programa para Linux, es posible que desee ver en la agrupación para arriba en el formato apropiado para los gestores de paquetes diferentes distribuciones.

Este consejo es obviamente irrelevante en sistemas que no tienen los gestores de paquetes (Windows, Mac y creo).

dejó claro que para mí en realidad hay dos formas comunes para tener su programa de ejecución de Python como un demonio (no me había dado cuenta de eso tan claramente de las respuestas existentes):

  

Hay dos enfoques para la creación de aplicaciones como servidores de demonio   en Python.

     
      
  • La primera es a manejar todas las tareas de sarting y   demonios de frenado en sí mismo código Python . La forma más sencilla de hacerlo es   con el paquete python-daemon que podría finalmente hacer su camino   en la distribución Python.
  •   

de Poeljapon respuesta es un ejemplo de esta primera aproximación, aunque no utiliza el paquete python-daemon, pero los enlaces a una costumbre script en Python, pero muy limpio.

  
      
  • El otro enfoque es utilizar las herramientas   suministrado por el sistema operativo . En el caso de Debain, esto significa   escribir un guión de inicio que hace uso de la start-stop-daemon   programa.
  •   
de

Ali Afshar respuesta es un ejemplo de secuencia de comandos shell de la segunda aproximación, utilizando el start-stop-daemon.

La entrada del blog he citado tiene un ejemplo de secuencia de comandos shell, y algunos detalles adicionales sobre cosas como el inicio de su demonio al iniciar el sistema y reiniciar el demonio de forma automática cuando se detiene por cualquier razón.

corrígeme si mal, pero creo que la pregunta es cómo implementar el demonio. Establecer su aplicación a instalar a través de la pipa y luego hacer el entry_point un cli(daemon()). A continuación, crear un guión de inicio que simplemente funciona $app_name &

"generalmente deben ejecutarse como un demonio?"

No - en la superficie - hacer un montón de sentido. "En general" no es sensato. O es un demonio o no. Es posible que desee actualizar su pregunta.

Para ver ejemplos de los demonios, leer sobre demonios como httpd de Apache o cualquier servidor de base de datos (que son demonios) o el demonio de correo SMTPD.

O, tal vez, leer sobre algo más simple, como el demonio FTP, SSH demonio, demonio de Telnet.

En el mundo Linux, tendrá su directorio de instalación de la aplicación, algunos directorio de trabajo, además de los directorios de archivos de configuración.

Utilizamos /opt/ourapp para la aplicación (que es Python, pero no lo instale en lib/site-packages de Python)

Utilizamos /var/ourapp para archivos de trabajo y nuestros archivos de configuración.

Podríamos utilizar /etc/ourapp para los archivos de configuración - Sería coherente -. Pero no lo hacemos

Nosotros no - sin embargo - utilizar los scripts init.d para el inicio. Pero esa es la pieza final, inicio automatizado. Por ahora, hemos administradores de sistemas iniciar los demonios.

Esto se basa, en parte, en http://www.pathname.com/fhs/ y http://tldp.org/LDP/ Linux sistema de ficheros de jerarquía / html / Linux sistema de ficheros de Hierarchy.html .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top