Hola,script de Python como un servicio Linux/daemon
estoy tratando de dejar que un script en Python funcionar como servicio (demonio) en Linux (Ubuntu).
En la web existen varias soluciones como:
http://pypi.python.org/pypi/python-daemon/
Un proceso demonio Unix buen comportamiento es difícil de hacerlo bien, pero los pasos requeridos son prácticamente los mismos para cada programa demonio. Una instancia de DaemonContext contiene el comportamiento y el entorno de proceso configurado para el programa; use la instancia como administrador de contexto para ingresar un estado de daemon.
http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/
Sin embargo ya que quiero integrar mi script en Python, específicamente con Ubuntu Linux mi solución es una combinación con un script de init.d
#!/bin/bash
WORK_DIR="/var/lib/foo"
DAEMON="/usr/bin/python"
ARGS="/opt/foo/linux_service.py"
PIDFILE="/var/run/foo.pid"
USER="foo"
case "$1" in
start)
echo "Starting server"
mkdir -p "$WORK_DIR"
/sbin/start-stop-daemon --start --pidfile $PIDFILE \
--user $USER --group $USER \
-b --make-pidfile \
--chuid $USER \
--exec $DAEMON $ARGS
;;
stop)
echo "Stopping server"
/sbin/start-stop-daemon --stop --pidfile $PIDFILE --verbose
;;
*)
echo "Usage: /etc/init.d/$USER {start|stop}"
exit 1
;;
esac
exit 0
y en Python:
import signal
import time
import multiprocessing
stop_event = multiprocessing.Event()
def stop(signum, frame):
stop_event.set()
signal.signal(signal.SIGTERM, stop)
if __name__ == '__main__':
while not stop_event.is_set():
time.sleep(3)
Mi pregunta ahora es si este enfoque es correcto. ¿Debo manejar alguna señal adicional? ¿Será un "proceso de demonio de Unix de buen comportamiento"?
Se derecha, recién llegado es el estándar hoy en día! Como la secuencia de comandos anterior maneja SIGTERM, debería estar bien con su archivo de configuración :) – tauran
Cambié la secuencia de comandos a advenedizo y funciona como debería ... – tauran
Un ajuste adicional que hice justo ahora. Si su script de python se ejecuta bajo un virtualenv, solo necesita cambiar el upstart para usar el ejecutable de python del entorno: 'exec /home/user/.env/environ/bin/python/some/dir/script.py' –