Script Python en tant que service / daemon linux

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:

    1. En cas d’échec, vérifiez d’abord /var/log/upstart/.log
    2. Si votre script implémente un démon avec python-daemon , vous n’utilisez PAS la strophe ‘expect daemon’. Ne pas attendre Je ne sais pas pourquoi. (Si quelqu’un sait pourquoi – merci de poster!)
    3. En outre, continuez à vérifier le “script d’état initctl” pour vous assurer que vous êtes prêt (démarrage / exécution). (et faire un rechargement lorsque vous mettez à jour votre fichier de configuration)

    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