Bonjour à tous,

C’est mon premier article sur ce blog, je me présente donc rapidement : Nivon Adrien, actuellement en troisième année à SUPINFO sur le campus de Clermont-Ferrand, membre de l’équipe de développement M2ENV. :-)

Aujourd’hui, je vais vous expliquer comment automatiser le lancement d’un démon Linux. On peut comparer un démon à un service sous Windows.

Certains sont lancés automatiquement au démarrage d’autres manuellement.

Commençons par les bases : le démarrage d’un système Linux.

Il faut savoir qu’un système Linux passe par plusieurs stades pour démarrer.

En effet, il existe 7 étapes lors d’un lancement/arrêt d’un système Linux :

  • Niveau 0 : Arrêt de la machine.
  • Niveau 1 : Maintenance de la machine (seul le shell existe mais aucun service n’est lancé) ou single-user
  • Niveau 2 à 5 : Multi-utilisateurs avec plus ou moins de services (2 par défaut, 3 à 5 sont dit « libres »).
  • Niveau 6 : redémarrage de la machine.

Vous pouvez connaître le niveau d’exécution actuel avec la commande suivante :

runlevel

Cette commande vous renverra le niveau d’exécution précédent suivi d’un espace puis le niveau d’exécution actuel.

S’il n’y a pas de niveau d’exécution précèdent alors un N apparaitra.

Vous pouvez également demander à changer de niveau d’exécution avec la commande suivante :

telinit LevelVoulu

Un petit exemple ne fait jamais de mal :

exemple de commande runlevel et telinit

exemple

Ici on voit que la machine était dans le niveau 2 d’exécution et qu’elle n’avait pas d’ancien niveau d’exécution, puis on demande à passer au niveau d’exécution 5.

En faisant runlevel on voit que la machine est au niveau 5 et que son ancien état d’exécution était le niveau 2.

REMARQUE : si vous faites un telinit 6 votre machine fera un redémarrage, si vous faites un telinit 0 votre machine s’arrêtera.

Ne vous amusez pas à faire un telinit 0 ou 6 pour le plaisir. En effet certains processus ont besoin de suivre une procédure plus « standard » afin de ne pas avoir de pertes de données.

L’utilisation des commandes shutdown et reboot est donc plus adéquat. (pensez à votre machine :) )

Bien, maintenant que vous savez comment changer d’état et dans quel état se trouve votre machine, voyons quels sont les paramètres initiaux de lancement :

Vous devez savoir qu’une fois le noyau Linux chargé, le premier processus est créé. Et je vous donne son nom tout de suite : INIT.

INIT est le père de tout autre processus et gère donc aussi le niveau d’exécution de la machine. (d’où le nom de la commande telinit ^^).

Pour savoir dans quel niveau d’exécution lancer la machine, il suffit d’aller voir le fichier suivant :

/etc/inittab

Ce fichier contient de nombreux paramètres mais celui qui nous intéresse est au début  :

lignes interessante du fichier inittab

les lignes qui nous initéressent (HO le jeu de mot ^^)

Bien, comme vous pouvez le voir, le niveau par défaut d’une Debian est 2 mais vous pouvez changer cette valeur comme bon vous semble.

REMARQUE : Évitez le 0 et le 6 quand même …. à moins d’avoir un penchant masochiste évidement, ou de faire une blaguounette à un ami.

Et n’oubliez pas : un petit MAN de runlevel, telinit et inittab peut toujours aider pour des informations supplémentaires.

Bon alors vous allez me dire : « OK c’est cool, mais le rapport avec nos Démons automatisés ? »

J’y arrive, j’y arrive. Mais pas encore tout de suite, car il faut bien comprendre comment tout cela fonctionne sinon votre Démon ne sera, soit jamais lancé, soit lancé et tué juste après …

Maintenant que INIT sait dans quel level il doit lancer la machine et bien il va aller dans le répertoire associé à ce level.

En fait si vous allez dans le répertoire /etc/, vous y trouverez les dossiers suivant :

  • rc0.d/
  • rc1.d/
  • rc2.d/
  • rc3.d/
  • rc4.d/
  • rc5.d/
  • rcS.d/
  • rc.local (fichier)

Je pense que vous l’avez compris le chiffre de chaque dossier correspond au level indiqué.

Notez la présence du dossier rcS.d/ et du fichier rc.local

Le dossier rcS.d/ est un peu spécial, INIT va tout le temps commencer par appeler les scripts de ce dossier, puis ensuite appellera le rc?.d définit dans /etc/inittab.

rc.local, lui n’est là que pour faire un exit 0 à chaque fin de level multi-utilisateur (cat de rc-local vous donnera des indications supplémentaires).

Bien maintenant on sait à quoi servent ces jolis dossiers, alors voyons ce qu’ils renferment :

contenu du dossier rc2.d

contenu du dossier rc2.d

Mon dieu !!!!!! quelle horreur !!! qu’est-ce donc ???

Et bien pour faire simple voici les scripts de démarrage et d’arrêt de nos petits Démons :D

(hummm …. attention, il s’agit de liens et pas de scripts ^^.)

Alors une petite explication s’impose :

On peut voir que chaque lien commence par un S suivi de 2 chiffres puis d’un nom.

Le nom c’est celui du Démon qui sera lancé. Le S correspond à START et les 2 chiffres correspondent à l’ordre de lancement.

Donc 01 sera lancé avant 02 et ainsi de suite. Dans le cas ou le chiffre serait identique (ce qui est souvent le cas pour 99) alors c’est l’ordre alphabétique qui sera pris en compte.

Pour arrêter un Démon il faut suivre la même logique mais au lieu d’un S on a un K et la priorité est toujours définie par les chiffres. 01 sera arrêté en premier puis 02 …. etc …

exemple :

S18apache2

Ici, le Démon Apache sera lancé en 18ème position.

K01apache2

Ici, le Démon Apache sera arrêté en 1 premier.

Alors ? c’est pas si compliqué hein ?

Donc si vous avez bien compris la logique des S et des K et la logique des levels, vous êtes capables de me dire ou se trouvent les scripts de démarrage et les scripts d’arrêt ?

On vérifie ?

Et oui vous avez bien deviné !!! les liens commençant par S sont dans les rc1.d/ à rc5.d/ en passant par rcS.d/ et les liens commençant par K sont dans rc0.d/


REMARQUE : c’est une logique de base vous pouvez très bien mettre des scripts K dans un rc2.d/ parce que vous ne voulez pas d’un Démon à ce niveau :) c’est à vous de voir ensuite ;)

Autre chose importante (et c’est un conseil d’ami) quand vous faites un script de démarrage mettez 99 comme priorité pourquoi? Dans votre script, vous pouvez faire appel à des services qui n’ont pas encore démarrés, si c’est le cas, ce dernier plantera …

Exemple : vous voulez qu’à chaque démarrage, une page soit imprimée avec comme texte « Le serveur à démarré le  » puis la date. Vous faites votre petit script, vous le testez, il fonctionne puis vous le mettez dans le rc.d qui va bien. Mais au démarrage, rien ne s’imprime … et oui, peut être que les services réseaux et/ou d’imprimantes n’ont pas démarré …

Donc je le répète (et je sais de quoi je parle) PRIORITÉ A 99 !!!! pour le démarrage d’un Démon (à moins d’être sûr de ce qu’on fait bien sûr ^^).

Bien maintenant voyons voir ou « pointent » nos petits liens:

Lien d'un rc?.d

lien de démarrage du Démon Apache

Comme on peut le voir notre petit lien pointe vers /etc/init.d/apache2.

Et ceci est le vrai Démon !!!!

Donc en fait les liens contenus dans les dossiers rc?.d/ ne servent qu’à une seule chose :

Si le lien commence par S alors : on appelle le Démon avec l’argument START.

Inversement, si le lien commence par K : on appelle le Démon vec l’argument STOP.

SIMPLE ET PUISSANT.

REMARQUE : si vous oubliez le S ou le K devant, INIT lancera par défaut le script.

Bien ben voila maintenant la dernière chose que je vais vous apprendre pour faire démarrer un Démon, c’est créer ce fameux lien :)

Pour créer un lien pointant sur un Démon vous avez 2 possibilités :

  • la manuelle, pour bien comprendre ce que l’on fait
  • la facile, pour aller plus vite :-)

Commençons par la première :

  • Placez vous dans le dossier rc?.d/ voulu (en gros au niveau d’exécution auquel vous souhaitez lancer votre Démon), si vous ne savez pas vraiment ou vous voulez le lancer quoi qu’il arrive allez dans rcS.d/
  • tapez la commande suivante :

ln -s ../init.d/NomDemon S99NomDemon

  • placez vous dans le dossier rc0.d/
  • tapez la commande suivante :

ln -s ../init.d/NomDemon K01NomDemon

Voici la méthode simplifiée (mais qui revient exactement au même).

  • tapez la commande suivante :

update-rc.d NomDemon Stop Priorité Levels Start Priorité Levels

Cette commande revient exactement à faire ce que nous avons fait au-dessus mais elle se charge de le faire pour vous :D

Voilà, maintenant vous savez comment rendre le lancement d’un Démon automatique :) très utile lorsque que vous créez vos propres Démons.

Certainement mon prochain article : La création de Démons avec le skeleton Linux !!!!

Allez à plus tard et n’oubliez pas : MAN, Google et le monde vous appartient. xD