Script Python que linux service/démon
Bonjour,
Je suis en train de laisser un script python pour exécuter en tant que service (daemon) sur (ubuntu) linux.
Sur le web, il existe plusieurs solutions comme:
http://pypi.python.org/pypi/python-daemon/
Une sage Unix processus de démon est difficile d'obtenir un droit, mais les étapes sont sensiblement les mêmes pour chaque programme démon. Un DaemonContext instance détient le comportement et les process de l'environnement pour le programme; utiliser l'instance en tant que gestionnaire de contexte pour saisir un démon de l'état.
http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/
Cependant que je souhaite intégrer à mon script python spécifiquement avec ubuntu linux ma solution est une combinaison avec une init.d script
#!/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
et 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)
Ma question est maintenant de savoir si cette approche est correcte. Dois-je gérer tout de signaux supplémentaires? Ce sera une sorte de "well-behaved Unix processus de démon"?
Vous devez vous connecter pour publier un commentaire.
En supposant que le démon a une façon de continuellement en cours d'exécution (certains boucle d'événements, tordu, peu importe), vous pouvez essayer d'utiliser
upstart
.Voici un exemple arriviste config pour un hypothétique Python de service:
Si vous enregistrez ce script.conf pour
/etc/init
vous simple de faire unVous pouvez l'arrêter avec
stop script
. Ce que le ci-dessus arriviste conf dit est de démarrer ce service sur redémarre et également le redémarrer si il meurt.Comme pour le traitement du signal - votre processus devrait naturellement répondre à
SIGTERM
. Par défaut, cela devrait être géré, sauf si vous avez expressément de l'installation de votre propre gestionnaire de signal.exec /home/user/.env/environ/bin/python /some/dir/script.py
Rloton la réponse est bonne. Voici un peu de raffinement, tout simplement parce que j'ai passé une tonne de temps de débogage. Et j'ai besoin de faire une nouvelle réponse afin que je puisse formater correctement.
Un couple d'autres points qui m'a pris une éternité pour déboguer:
Voici ma version:
initctl reload-configuration
suivie parservice myservice start
?