Faire un Demon (ou service) sous Linux

Le terme demon (=Disk and Execution MONitor) 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
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, SCRIPTNAMERendez 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 avec sudo service launcher start l'arrêter avec sudo service launcher stop . le redémarrer avec sudo service launcher restart vérifier son état avec sudo service launcher status
Pour que votre programme soit en tâche de fond, 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 : Jamaique.