{{tag>Trusty tutoriel BROUILLON}} ====== Faire un Demon (ou service) sous Linux ====== Le terme **demon** (=**D**isk and **E**xecution **MON**itor) désigne un processus qui s'exécute en arrière-plan plutôt que sous le contrôle direct d'un utilisateur. (//Wikipedia//) Soit un tout petit serveur qui tourne sous Linux. Pour démarrer le serveur, il faut entrer login, mot de passe, lancer le terminal, s'identifier en tant que root et lancer le script de démarrage... Un **demon** permet de lancer un script avec toutes les autorisations nécessaires, avant l'ouverture de la session. ===== Pré-requis ===== * un programme en shell (ex : **LAUNCHER**) qui lance votre application. Copiez-le si besoin dans **/usr/bin** :sudo cp /dir1/dir2/launcher /usr/bin/launcher Tout se passe dans les dossiers **/etc/init.d/** et **/usr/bin/** * Le dossier **/etc/init.d** contient tous les scripts **demons**. * Le dossier **/usr/bin/** contient les exécutables. Il fait partie du $PATH et ses programmes peuvent être appelés directement sans spécifier de chemin. ===== Première étape ===== Tout d'abord, il faut créer le script d'exécution qui démarre le programme. Pour cela, copiez le fichier modèle **/etc/init.d/skeleton** : * sudo cp /etc/init.d/skeleton /etc/init.d/launcher Les lignes importantes de ce fichier sont : PATH=/usr/sbin:/usr/bin:/sbin:/bin DESC="Description du service" NAME=nomdudemon DAEMON=/usr/bin/$NAME DAEMON_ARGS="--options args" PIDFILE=/var/run/$NAME.pid SCRIPTNAME=/etc/init.d/$NAME [[tutoriel:mini-tutoriels:ficedit#Modifier un fichier avec les droits d'administration|Ouvrez avec les droits d'administration]] le fichier **/etc/init.d/launcher** pour le modifier comme ceci : * Remplissez avec vos paramètres : ^DESC|Courte description de votre launcher| ^NAME|Nom de votre exécutable (ici, launcher)| ^DAEMON_ARGS|options de lancement (paramètres au lancement de la commande)| * Ne touchez pas à : PATH, DAEMON, PIDFILE, SCRIPTNAME Rendez ce script exécutable : * sudo chmod +x /etc/init.d/launcher ===== Autres étapes ===== Le programme qui gère les demons est **update-rc.d** qui crée des liens depuis **/etc/rc0.d/launcher** vers **/etc/init.d/launcher**. cf. l'article **Update-rc.d** du man traduit (sur [[http://manpage.ubuntu.com]]) Il faut maintenant enregistrer votre script pour qu'il soit pris en compte. Tapez : $ sudo update-rc.d launcher defaults Adding system startup for /etc/init.d/lighttpd ... /etc/rc0.d/K20/lighttpd -> ../init.d/lighttpd /etc/rc1.d/K20/lighttpd -> ../init.d/lighttpd /etc/rc6.d/K20/lighttpd -> ../init.d/lighttpd /etc/rc2.d/S20/lighttpd -> ../init.d/lighttpd /etc/rc3.d/S20/lighttpd -> ../init.d/lighttpd /etc/rc4.d/S20/lighttpd -> ../init.d/lighttpd /etc/rc5.d/S20/lighttpd -> ../init.d/lighttpd ^update-rc.d|pour mettre à jour| ^launcher|nom de votre script| ^defaults|options par défaut : placement en bout de file d'attente, pour éviter les conflits| ===== Pour supprimer un demon ===== Pour supprimer le demon **launcher**, il faut exécuter la suite de commandes : ^/etc/init.d/launcher stop|Termine le programme| ^update-rc.d -f launcher remove|Supprime l'enregistrement du script| ^rm /etc/init.d/launcher|pour supprimer le skeleton modifié| ^rm /usr/bin/launcher|pour supprimer la copie de votre script| Votre **init.d** est maintenant nettoyé. ===== Conclusion ===== Vous pouvez maintenant : * exécuter votre script avecsudo service launcher start * l'arrêter avecsudo service launcher stop. * le redémarrer avecsudo service launcher restart * vérifier son état avecsudo service launcher status Pour que votre programme soit en tâche de fond, [[tutoriel:mini-tutoriels:ficedit#Modifier un fichier avec les droits d'administration|ouvrez avec les droits d'administration]] le fichier **/etc/init.d/launcher** pour le modifier au niveau de la fonction **do_start()** : 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. } start-stop-daemon est la commande principale. Analysons ses options : ^--start|pour démarrer le script| ^--quiet|pour rendre le script silencieux (CQFD)| ^--background|pour mettre le script en arrière-plan (CQFD)| ^--make-pidfile|pour faire un fichier de processus (pour pouvoir forcer l'arrêt plus tard)| ^--pidfile $PIDFILE|pour localiser le pidfile créé ci-dessus| ^--exec $DAEMON|pour lancer le programme| ^--test|pour tester le programme| ===== Problèmes connus ===== ===== Voir aussi ===== * (**fr**) le tutoriel de openclassroom : [[http://fr.openclassrooms.com/informatique/cours/faire-un-demon-sous-linux]] ---- //Contributeurs principaux : [[:utilisateurs:jamaique]].//