Comment gérer les services au démarrage ?

centos linux startup

La plupart des démons se trouvent dans le répertoire /etc/rc.d/init.d . C’est là qu’il faut copier le script qui va gérer le démon/service ou l’appli que l’on veut lancer au démarrage.

Pour savoir les démons lancés selon la runlevel, il faut aller dans le sous répertoire correspondant. Ainsi il faut aller dans /etc/rc.d/rcx.d (avec x = numéro de runlevel ).
Après avoir choisi le runlevel dans lequel on veut lancer le démon/service, il suffit de faire un lien vers le script qui se trouve dans /etc/rc.d/init.d . Pour bien faire les choses il convient de respecter certaines conventions.

Conventions :

  • Le nom doit commancer par S (= Start ) suivi d’un numéro d’ordre sur 2 chiffres au minimum. Cela donne un nom du type Sxynom.
  • Si le script doit faire quelquechose de spécial à l’arrêt du système il faut rajouter un lien qui commence par un K (= kill).
  • Il devrait accepter comme arguments start (pour être lancé), stop (pour être arrêter) et accessoirement restart (pour relancer) et status (pour savoir si le script tourne et avoir d’autres infos).
  • Il convient de choisir correctement le numéro d’ordre. Il ne faut pas qu’il soit identique à celui d’un autre démon, et enfin il faut choisir le numéro d’ordre correct.
    En effet imaginons que notre démon utilise la carte réseau et que le script qui configure les cartes réseaux ait un numéro d’ordre de 10. Il faudra que notre démon ait un numéro d’ordre supérieur à 10, sinon comment pourrait il utiliser les cartes réseaux si elles ne sont pas configurées ?

Lancement/arrêt :

Pour lancer/arrêter un service il existe plusieurs possibilités :

Via drakxservices

Vous avez une Mandrake, alors vous pouvez utiliser drakxservices ( Mandrake Control center -> Système -> services ). Avec drakxservices vous pourrez lancer et arrêter chaque services, spécifier si vous voulez qu’ils se lancent au démarrage pour le runlevel courant et aussi avoir une description pour certains.

Manuellement

Vous pouvez le faire à la main en lançant directement le script qui gère le service. Ces scripts sont dans /etc/rc.d/init.d . Cela donne :

 /etc/rc.d/init.d/monservice stop<- Pour arréter le service
/etc/rc.d/init.d/monservice start<- Pour lancer le service
/etc/rc.d/init.d/monservice restart<- Pour relancer le service
/etc/rc.d/init.d/monservice status<- Pour connaitre l’état du service

Via la commande service

Vous pouvez aussi utiliser le programme nommé service. Ce programme est très simple à utiliser. Si vous connaissez le nom du service il suffit de faire :

 service monservice stop<- Pour arréter le service
service monservice start<- Pour lancer le service
service monservice restart<- Pour relancer le service
service monservice status<- Pour connaitre l’état du service
service monservice<- Pour connaitre les autres options que peut accepter ce service

Par exemple pour samba dont le nom de service est smb cela donne :

[root@bastard root]# service smb stop
Arrêt des services SaMBa : [ OK ]
Arrêt du service NMB : [ OK ]

[root@bastard root]# service smb start
Lancement du service SaMBa : [ OK ]
Lancement du service NMB : [ OK ]

[root@bastard root]# service smb restart
Arrêt des services SaMBa : [ OK ]
Arrêt du service NMB : [ OK ]
Lancement du service SaMBa : [ OK ]
Lancement du service NMB : [ OK ]

[root@bastard root]# service smb status
smbd (pid 31865) est en cours d’exécution…
nmbd (pid 31876) est en cours d’exécution…

[root@bastard root]# service smb
I need an action
Utilisation: /etc/init.d/smb {start|stop|restart|status| condrestart}

Administration :

On peut vouloir ensuite spécifier pour quel runlevel on veut que le script se lance automatiquement au démarrage et pour quel autre on ne veut pas. Pour cela il y a plusieurs possibilités.

Via drakxservices

Pour les utilisateurs de la Mandrake, ils pourront utiliser drakxservices (Mandrake Contriol Center -> Système -> Services ) pour définir si ils veulent lancer le service pour le runlevel courant au démarrage ou non. Ils pourront aussi disposer d’une description du service ( si celui-ci le supporte ) ainsi que de son état courrant ( démarré ou à l’arrêt )

Via ntsysv ou tksysv

Les utilisateurs de Red Hat et de Mandrake pourront aussi utiliser ntsysv voire tksysv qui sont des outils en mode console ou avec une interface graphique en tcl/tk pour gérer les services.
Pour le runlevel courant il suffit de lancer ntsysv sans arguments et de cocher les services que l’on veut lancer au démarrage :

$> ntsysv

Pour un autre runlevel il suffit de spécifier la runlevel visé :

$> ntsysv –level 3<- permet de gérer les services de la runlevel 3
$> ntsysv –level 35<- pour gérer plusieurs runlevel en même temps ( ici 3 et 5 )

En utilisant chkconfig

chkconfig est un utilitaire qui permet de gérer les services en ligne de commande. Il se révèle pratique dans le sens qui permet par exemple de gérer des services dans un script. Pour cela il faut que le script du service soit correctement formaté car les informations sur celui-ci ( runlevel par défaut pour lequel le script doit être activé, description ) sont directement intégrées au début de celui-ci.

Obtenir des informations sur un service

$> chkconfig –list<- fournit la liste de tous les services reconnus et précise pour chaque runlevel si ceux-ci sont lancés au démarrage

$> chkconfig –list service <- fourni la configuration actuelle du service nommé service pour tous les runlevel

Actriver/Désactiver un service sur un service

$> chkconfig –level 35 service on <- spécifie que service doit être lancé au démarrage pour les runlevel 3 et 5

$> chkconfig –level 35 service off <- spécifie que service ne doit pas être lancé au démarrage pour les runlevel 3 et 5

$> chkconfig –add service<- ajoute service comme étant un service pouvant être géré par chkconfig ( bien sûr le fichier du script doit être correctement formaté )

$> chkconfig –del service<- supprime le service

$> chkconfig service reset<- remet la configuration à celle par défaut définie dans le script

Exemple :

Je veux lancer le démon diablo dont le script s’apelle diablod. ce script doit être lancé au démarrage des runlevel 3 et 5 et son n° d’ordre est 99 et … qui ne fait rien de spécial

Manuellement

On va procéder manuellement notamment en ce qui concerne la configuration du démarrage du script.

$>  cp diablod /etc/rc.d/init.d/<- je copie le script diablod dans /etc/rc.d/init.d

$>  chmod +x /etc/rc.d/init.d/diablod<- Bien sûr il faut que le script soit exécutable

$>  ln -s /etc/rc.d/init.d/diablod /etc/rc.d/rc5.d/S99diablod <- Comme je suis toujours en runlevel 5 et que je veux qu’il soit lancé en runlevel 5, je vais mettre le lien  dans /etc/rc.d/rc5.d

$>  ln -s /etc/rc.d/init.d/diablod /etc/rc.d/rc3.d/S99diablod <- Je vais de temsp en temps en runlevel 3 et je veux qu’il se lance au boot, donc j’ajoute un lien pour la runlevel 3

$>  ln -s /etc/rc.d/init.d/diablod /etc/rc.d/rc5.d/K99diablod <- Comme il fait un truc spécial à l’arrêt du système je rajoute un script kill

Avec chkconfig

Voici comment il me faudrait gérer le script avec chkconfig. Vous allez voir cela simplifie pas mal de chose car chkconfig s’occupe de tout.

$>  cp diablod /etc/rc.d/init.d/<- Une nécessité : je copie le script diablod dans /etc/rc.d/init.d

$>  chmod +x /etc/rc.d/init.d/diablod<- Bien sûr il faut que le script soit exécutable

$> chkconfig –add diablod<- je demande à chkconfig de prendre en charge mon script

$> chkconfig –level 23 diablod on<- J’active mon script au démarrage pour le runlevel 2 et 3

$> chkconfig diablod reset<- Oups, je me suis trompé, il fallait que ce soit 3 et 5. Comme c’est précisé dans mon script je demande à chkconfig de mettre les valeurs par défaut définies dans le script

Comme je l’ai dit avant, il suffit de regarder dans /etc/inittab pour connaitre la signification de vos runlevel.

contenu d’un script de service type

Voici le squelette de ce à quoi devrait ressembler un script globalement :

#!/bin/bash
#
#  chkconfig: 35 99 9
#  description: démarre et arrête mon service personalisé diablo
#               qui ne fait rien de spécial

# on va tester les arguments donnés au script
case “$1” in
start)
#si on passe comme argument start
echo -n “Lancement de $(basename $0)”
…. ce qu’il faut faire….
;;
stop)
#si on passe comme argument stop
echo -n “Arrêt de $(basename $0)”
…. ce qu’il faut faire….
;;
restart)
#si on passe comme argument restart
echo -n “Redémarrage de $(basename $0)”
…. ce qu’il faut faire….
;;
*)
#Pour tous les autres cas
echo -n “Usage: $(basename $0) start| stop|restart”
#on rappelle la syntaxe du script et on quitte
exit 1
esac

La ligne chkconfig: 35 99 9 signifie que chkconfig doit configurer le service pour qu’il se lance au démarrage des runlevel 3 et 5 avec un n° d’ordre de 99.
la ligne description contient la description du script , telle que par exemple on la verra afficher dans drakxservices.