¿Cómo se crea un demonio en Python?

8 minutos de lectura

¿Como se crea un demonio en Python
davidmytton

Buscando en Google revela fragmentos de código x2. El primer resultado es para esta receta de código que tiene mucha documentación y explicación, junto con una discusión útil debajo.

Sin embargo, otra muestra de código, aunque no contiene tanta documentación, incluye código de muestra para pasar comandos como iniciar, detener y reiniciar. También crea un archivo PID que puede ser útil para verificar si el demonio ya se está ejecutando, etc.

Estos ejemplos explican cómo crear el daemon. ¿Hay cosas adicionales que deben ser consideradas? ¿Es una muestra mejor que la otra y por qué?

  • Siempre he encontrado el código de daemonización innecesario. ¿Por qué no dejar que el caparazón lo haga?

    – emil.p.stanchev

    13 de noviembre de 2010 a las 20:12

  • Porque no hace setsid o setpgrp.

    – bmargulies

    24 de marzo de 2011 a las 1:26

  • Utilizar supervisord.org. De esta manera, no necesita bifurcar() o redirigir su stdin/stderr. Solo escribe un programa normal.

    – Guettli

    1 de octubre de 2013 a las 9:02


¿Como se crea un demonio en Python
jeff bauer

Solución actual

Una implementación de referencia de PEP 3143 (biblioteca de procesos de daemon estándar) ya está disponible como python-daemon.

Respuesta histórica

Sander Marechal ejemplo de código es superior al original, que se publicó originalmente en 2004. Una vez contribuí con un daemonizer para Pyro, pero probablemente usaría el código de Sander si tuviera que hacerlo de nuevo.

  • Editar: desde que publiqué originalmente esta respuesta, ahora está disponible una implementación de referencia de PEP 3143: pypi.python.org/pypi/python-daemon

    –Jeff Bauer

    28 de enero de 2011 a las 18:45


  • @JeffBauer El enlace original ha muerto, recuerdo que fue útil, no conocerías un enlace en vivo para eso, ¿verdad?

    – Crazy Casta

    25 de febrero de 2014 a las 19:43

  • @CrazyCasta: La versión de Sander Marechal todavía está disponible en el Máquina de regreso

    –Jeff Bauer

    25 de febrero de 2014 a las 21:26

  • @JeffBauer: el código de Sander sigue siendo mejor que http://pypi.python.org/pypi/python-daemon. Más confiable. Sólo un ejemplo: intenta empezar dos veces el mismo demonio con python-daemon : gran error feo. Con el código de Sander: un buen aviso “Daemon ya se está ejecutando”.

    – Basj

    17/01/2016 a las 20:50


  • Dado que aún falta la documentación del módulo “python-daemon” (vea también muchas otras preguntas de SO) y es bastante oscura (¿cómo iniciar/detener correctamente un demonio desde la línea de comandos con este módulo?), modifiqué el ejemplo de código de Sander Marechal para agregar quit() método que se ejecuta antes de que se detenga el daemon. Aquí lo tienes.

    – Basj

    12/11/2016 a las 10:30


1646759717 264 ¿Como se crea un demonio en Python
nariz grande

Hay muchas cosas raras cuidar al convertirse en un proceso de demonio de buen comportamiento:

  • evitar volcados de núcleo (muchos demonios se ejecutan como raíz y los volcados de núcleo pueden contener información confidencial)

  • comportarse correctamente dentro de un chroot cárcel

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

  • renunciar elevado suid, sgid privilegios

  • cierre todos los descriptores de archivos abiertos, con exclusiones según el caso de uso

  • comportarse correctamente si se inicia dentro de un contexto ya separado, como init, inetdetc

  • configurar controladores de señales para un comportamiento sensible del demonio, pero también con controladores específicos determinados por el caso de uso

  • redirigir los flujos estándar stdin, stdout, stderr ya que un proceso daemon ya no tiene una terminal de control

  • manejar un archivo PID como un bloqueo de aviso cooperativo, que es una lata de gusanos en sí mismo con muchas formas contradictorias pero válidas de comportarse

  • Permitir una limpieza adecuada cuando finalice el proceso.

  • en realidad convertirse en un proceso daemon sin conducir a zombis

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

Todos estos están cubiertos por la PEP 3143 Especificación de “Biblioteca de procesos de daemon estándar”. los python-daemon la implementación de referencia funciona en Python 2.7 o posterior, y Python 3.2 o posterior.

  • “gaol” está escrito correctamente, porque así es como lo escribió W. Richard Stevens 🙂

    – nariz grande

    22 de febrero de 2011 a las 7:51

  • la cárcel es un cosa inglesa. El cartel es de Australia por lo que tiene sentido.

    – devin

    26 de noviembre de 2012 a las 18:35

  • ¿Algún plan para hacer una versión compatible con py3k?

    –Tim Tisdall

    12 de marzo de 2013 a las 14:35

1646759718 267 ¿Como se crea un demonio en Python
polvo kirkland

Aquí está mi daemon básico de Python ‘Howdy World’ con el que empiezo, cuando estoy desarrollando una nueva aplicación de daemon.

#!/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 necesitará el python-daemon Biblioteca. Puedes instalarlo por:

pip install python-daemon

Entonces empieza con ./howdy.py starty detenerlo con ./howdy.py stop.

  • Que daemon El módulo que importa no es una parte estándar de Python (todavía). Debe instalarse con pip install python-daemon o equivalente.

    – Nate

    10 de febrero de 2012 a las 23:50

  • Instalé python-daemon como usted describió, pero cuando intento ejecutar mi aplicación (igual que sus últimas 3 líneas), obtengo ImportError: no se puede importar el corredor de nombres

    – Maldita sea

    25 de febrero de 2012 a las 14:16


  • Esta sugerencia parece estar obsoleta; de todos modos, a partir de septiembre de 2013, python.org/dev/peps/pep-3143 no menciona un “corredor” que se pueda importar. Esto, por supuesto, explicaría la observación de @Nostradamnit.

    – offby1

    4 sep 2013 a las 21:44


  • Esto todavía funciona bien para mí, en septiembre de 2013, en Ubuntu 13.04, con paquetes de Python, python2.7 y python-daemon instalados. Con python3, sin embargo, veo el error “del corredor de importación de daemon ImportError: ningún módulo llamado ‘daemon'”

    –Dustin Kirkland

    5 sep 2013 a las 16:19

  • Estoy recibiendo el siguiente error io.UnsupportedOperation: File or stream is not seekable.

    – alper

    30 de abril de 2020 a las 13:46

Nota la python-daemon paquete que resuelve muchos problemas detrás de los demonios fuera de la caja.

Entre otras características, permite (de la descripción del paquete Debian):

  • Separe el proceso en su propio grupo de procesos.
  • Establezca el entorno de proceso apropiado para ejecutarse dentro de un chroot.
  • Renuncia a los privilegios suid y sgid.
  • Cierre todos los descriptores de archivos abiertos.
  • Cambie el directorio de trabajo, uid, gid y umask.
  • Establezca los controladores de señal apropiados.
  • Abra nuevos descriptores de archivos para stdin, stdout y stderr.
  • Administrar un archivo de bloqueo PID especificado.
  • Registre las funciones de limpieza para el procesamiento a la salida.

1646759720 554 ¿Como se crea un demonio en Python
chris johnson

Una alternativa: cree un programa Python normal, no demonizado y luego demonícelo externamente usando supervisado. Esto puede ahorrar muchos dolores de cabeza, y es *nix y portátil de idiomas.

  • Creo que esta es la mejor manera. Especialmente si desea ejecutar varios demonios en un sistema operativo. No codifiques, reutiliza.

    – Guettli

    1 de octubre de 2013 a las 8:59

  • Simplifica muchos problemas. He escrito verdaderos demonios, no son fáciles.

    –Chris Johnson

    1 oct 2013 a las 13:35

  • La mejor respuesta está escondida aquí 🙂

    – kawing-chiu

    14 de septiembre de 2015 a las 13:16

  • esto es oro Después de pasar horas tratando de ejecutar python-daemon, esta es la solución lista para usar que funciona para mí. Excelente documentación y ejemplos hicieron que mi daemon estuviera listo y funcionando en pocos minutos.

    – Nikhil Sahu

    11/10/2016 a las 12:40

  • O, si está utilizando un Linux moderno, ejecute su programa como un servicio systemd…

    – Mijaíl T.

    8 de agosto de 2021 a las 17:53

Probablemente no sea una respuesta directa a la pregunta, pero systemd puede usarse para ejecutar su aplicación como un demonio. Aquí hay un ejemplo:

[Unit]
Description=Python daemon
After=syslog.target
After=network.target

[Service]
Type=simple
User=<run as user>
Group=<run as group group>
ExecStart=/usr/bin/python <python script home>/script.py

# Give the script some time to startup
TimeoutSec=300

[Install]
WantedBy=multi-user.target

Prefiero este método porque gran parte del trabajo se hace por ti, y luego tu secuencia de comandos daemon se comporta de manera similar al resto de tu sistema.

  • Creo que esta es la mejor manera. Especialmente si desea ejecutar varios demonios en un sistema operativo. No codifiques, reutiliza.

    – Guettli

    1 de octubre de 2013 a las 8:59

  • Simplifica muchos problemas. He escrito verdaderos demonios, no son fáciles.

    –Chris Johnson

    1 oct 2013 a las 13:35

  • La mejor respuesta está escondida aquí 🙂

    – kawing-chiu

    14 de septiembre de 2015 a las 13:16

  • esto es oro Después de pasar horas tratando de ejecutar python-daemon, esta es la solución lista para usar que funciona para mí. Excelente documentación y ejemplos hicieron que mi daemon estuviera listo y funcionando en pocos minutos.

    – Nikhil Sahu

    11/10/2016 a las 12:40

  • O, si está utilizando un Linux moderno, ejecute su programa como un servicio systemd…

    – Mijaíl T.

    8 de agosto de 2021 a las 17:53

1646759720 93 ¿Como se crea un demonio en Python
Asclepio

Yap Di es un paquete de python. Se puede usar para convertir una secuencia de comandos de python en modo daemon desde dentro de la secuencia de comandos.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad