Créer un service pour vos programmes Python

Parfois il peut être utile qu’un programme démarre en même temps que l’ordinateur. Cet article va vous expliquer comment procéder pour utiliser un programme normal en tant que service (démon).

A titre d’exemple, nous allons créer un mini-serveur web qui affiche juste la date et l’heure, et nous allons l’installer sous forme de service.

Sous linux

1. Créons notre serveur web en Python

Copiez le code suivant dans /opt/monserveur/monserveur.py (/opt est pour les programmes optionnels ; il vous faut les droits root pour effectuer cette opération.)

#!/usr/bin/python
import datetime,BaseHTTPServer

class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type','text/plain')
        self.end_headers()
        self.wfile.write(str(datetime.datetime.now()))
        return

print "En ecoute sur le port 8088..."
server = BaseHTTPServer.HTTPServer(('', 8088), MyHandler)
server.serve_forever()

puis faites:

sudo chmod +x /opt/monserveur/monserveur.py

pour permettre l’exécution.

2. Placez un raccourci dans /usr/bin

sudo ln -s /opt/monserveur/monserveur.py /usr/bin/monserveur

Il est nécessaire que le programme soit lancé depuis /usr/bin ou /usr/sbin

3. Test !

Lancez le serveur:

monserveur

et dans votre navigateur, tapez: http://localhost:8088/

Vous devriez voir la date et l’heure.

Arrêtez maintenant votre serveur avec CTRL+C.

Nous allons maintenant l’installer en tant que service.

4. Créer le lanceur

Le système est fourni avec un squelette de lanceur. Faites:

sudo cp /etc/init.d/skeleton /etc/init.d/monserveur

5. Customiser le lanceur

Nous allons modifier le lanceur:

sudo gedit /etc/init.d/monserveur

Repérez les lignes suivantes:

PATH=/usr/sbin:/usr/bin:/sbin:/bin
DESC="Description of the service"
NAME=daemonexecutablename
DAEMON=/usr/sbin/$NAME
DAEMON_ARGS="--options args"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

Et renseignez ce qui concerne votre service:

DESC : description du service.
NAME : nom du service créé dans /usr/bin ou /usr/sbin
DAEMON: Nous avons placé notre serveur dans /usr/bin à la place de /usr/sbin: on corrige donc: DAEMON=/usr/bin/$NAME
DAEMON_ARGS: Notre serveur web ne prend aucune option en ligne de commande, nous mettons donc DAEMON_ARGS=""

Ce qui donne:

PATH=/usr/sbin:/usr/bin:/sbin:/bin
DESC="A simple webserver which gives date and time."
NAME=monserveur
DAEMON=/usr/bin/$NAME
DAEMON_ARGS=""
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

6. Options de démarrage

En tâche de fond

Habituellement, un programme qui se met en “démon” rend la main immédiatement après avoir été lancé et se met en tâche de fond. Si votre programme ne le fait pas (si votre programme ne rend pas la ligne de commande après être lancé), vous devrez ajouter l’option –background (voir ci-dessous)

C’est notre cas avec notre serveur web: on va ajouter –background

Pour pouvoir arrêter un service, il faut connaître son PID (identifiant du processus). Si votre programme ne créé pas de fichier .pid (ce qui est généralement le cas), ajoutez l’option –make-pidfile (voir ci-dessous).

C’est notre cas avec notre serveur web: on va ajouter –make-pidfile

Si vous devez utiliser l’option –background ou –make-pidfile, ajoutez-les dans les deux lignes commençant par start-stop-daemon –start...

Ce qui donne dans /etc/init.d/monserveur:

#
# Function that starts the daemon/service
#
do_start()
{
        # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started
        start-stop-daemon --start --quiet --background --make-pidfile --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
                || return 1
        start-stop-daemon --start --quiet --background --make-pidfile --pidfile $PIDFILE --exec $DAEMON -- \
                $DAEMON_ARGS \
                || return 2
        # Add code here, if necessary, that waits for the process to be ready
        # to handle requests from services started subsequently which depend
        # on this one.  As a last resort, sleep for some time.
}

7. Installer le raccourci service

sudo update-rc.d monserveur defaults 99

update-rc.d va installer les raccourcis pour démarrer le service en même temps que l’ordinateur.

monserveur fait référence au raccourcis /etc/init.d/monserveur defaults utilise les paramètres par défaut, et 99 sert à indiquer que ce service démarrera après tous les autres.

8. démarrer et arrêter le service

Pour démarrer manuellement le service:

sudo /etc/init.d/monserveur start

et testez sur http://localhost:8088/

( Vous pouvez voir le PID de votre service dans /var/run/monserveur.pid )

Pour arrêter manuellement le service:

sudo /etc/init.d/monserveur stop

(Le fichier .pid devrait avoir disparu.)

8. Tester le démarrage automatique du service

Maintenant, nous allons tester que le service démarre bien automatiquement au démarrage de l’ordinateur: Redémarrez votre ordinateur et ouvrez http://localhost:8088/ pour vérifier que le serveur est bien démarré.

9. Configurer le démarrage des services

Vous pouvez demander que le service ne démarre pas avec l’ordinateur sans le déinstaller.

il faut utiliser sysv-rc-conf pour modifier le niveau de démarrage d’un service

10. Supprimer le service

Pour supprimer le service:

sudo /etc/init.d/monserveur stop
sudo update-rc.d -f monserveur remove
sudo rm /etc/init.d/monserveur
sudo rm /usr/bin/monserveur

et supprimez /opt/monserveur et son contenu.