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.) .. code-block:: python #!/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.