Bonjour,
J’essaie de laisser un script python s’exécuter en tant que service (démon) sur Linux (ubuntu).
Sur le web, il existe plusieurs solutions comme:
http://pypi.python.org/pypi/python-daemon/
Un processus de démon Unix bien comporté est difficile à réaliser, mais les étapes requirejses sont les mêmes pour chaque programme démon. Une instance DaemonContext contient le comportement et l’environnement de processus configuré pour le programme; utilisez l’instance en tant que gestionnaire de contexte pour entrer dans un état démon.
http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/
Cependant, comme je veux intégrer mon script python spécifiquement avec Ubuntu Linux, ma solution est une combinaison avec un script 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
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 si cette approche est correcte. Dois-je gérer des signaux supplémentaires? S’agira-t-il d’un “processus démon Unix sage”?
En supposant que votre démon ait un moyen de fonctionner continuellement (une boucle d’événement, une torsion, etc.), vous pouvez essayer d’utiliser le upstart
.
Voici un exemple de configuration pour un service Python hypothétique:
description "My service" author "Some Dude " start on runlevel [234] stop on runlevel [0156] chdir /some/dir exec /some/dir/script.py respawn
Si vous sauvegardez ceci en tant que script.conf à /etc/init
vous suffit de faire une seule fois
$ sudo initctl reload-configuration $ sudo start script
Vous pouvez l’arrêter avec le stop script
. Ce que dit le upstart ci-dessus, c’est de démarrer ce service au redémarrage et de le redémarrer s’il meurt.
En ce qui concerne la gestion du signal, votre processus devrait naturellement répondre à SIGTERM
. Par défaut, cela devrait être géré à moins que vous ayez spécifiquement installé votre propre gestionnaire de signaux.
La réponse de Rloton est bonne. Voici un léger raffinement, simplement parce que j’ai passé une tonne de temps à déboguer. Et je dois faire une nouvelle réponse pour pouvoir formater correctement.
Un couple d’autres points qui m’a pris pour toujours pour déboguer:
Voici ma version:
description "My service" author "Some Dude " env PYTHON_HOME=/ env PATH=$PYTHON_HOME:$PATH start on runlevel [2345] stop on runlevel [016] chdir # NO expect stanza if your script uses python-daemon exec $PYTHON_HOME/bin/python script.py # Only turn on respawn after you've debugged getting it to start and stop properly respawn