Démarrer un programme en tant que service (démon)

Décembre 2016

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.

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

5.1 Identifier le service


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

5.2 Options de démarrage



5.2.1 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

5.2 PID


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.
}

6. 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.

7. 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.
Voir cet article: activer desactiver les services au demarrage

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.

11. Voir aussi


http://www.commentcamarche.net/forum/affich 10578157 lancer demon module python resolu

A voir également :

Ce document intitulé «  Démarrer un programme en tant que service (démon)  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.