Te traemos la contestación a esta dificultad, al menos eso pensamos. Si sigues con inquietudes déjanoslo saber en un comentario, que con placer te ayudaremos
Solución:
Solución actual
Una implementación de referencia de PEP 3143 (biblioteca de procesos de daemon estándar) ahora está disponible como python-daemon.
Respuesta histórica
El ejemplo de código de Sander Marechal 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.
Hay muchas cosas raras cuidar cuando se convierte en un proceso daemon 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
,inetd
etc -
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.
-
convertirse en un proceso demoníaco sin generar 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 Especificación PEP 3143 “Biblioteca de procesos de daemon estándar”. La implementación de referencia de python-daemon funciona en Python 2.7 o posterior y Python 3.2 o posterior.
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 start
y detenerlo con ./howdy.py stop
.
Calificaciones y comentarios
Si para ti ha sido útil este post, sería de mucha ayuda si lo compartes con más programadores y nos ayudes a dar difusión a nuestro contenido.