Création et gestion de services sous Linux


Rebol est un langage parfait pour créer des démons mais la principale difficulté réside dans leur parfaite intégration au système hôte. Un démon est un programme résident en mémoire qui doit être exécuté dés le démarrage du système. Sous Linux il existe une façon très simple de permettre l'exécution d'un script au démarrage. Il suffit de l'insérer à la fin du fichier /etc/inittab. Mais Linux dispose, à la différence d'un Unix, d'une gestion de services. Dans cette article nous allons examiner comment créer et gérer un service.

Les niveaux d'exécution

Il existe 6 niveaux d'exécution sous Linux :

Le niveau par défaut est déterminé dans le fichier /etc/inittab à la ligne qui se présente de la façon suivante : id:X:initdefault où X représente la valeur du niveau par défaut.

Attention il ne faut jamais mettre les valeurs 0 ou 6 dans l'inittab sous peine de voir son système s'arrêter ou rebooter au démarrage! Pour démarrer sur un niveau autre que celui par défaut il faut taper « linux X » au niveau de LILO. Tout le monde sait qu'il faut taper « linux single » pour démarrer en mode maintenance. Cela vient du fait que le niveau de maintenance est le niveau 1 (single). Il est donc tout à fait possible de de taper « linux 1 ».

Il est aussi possible de changer de niveau en cours d'exécution de Linux. Tapez tout d'abord (sous root) la commande « runlevel ». Elle vous indique le niveau d'exécution actuel du système. Pour changer de niveau, il suffit de taper « init X ». Pour redémarrer votre ordinateur au lieu de taper « reboot », il suffit de taper « init 6 ».


Le dossier « rc.d »

Les services et les niveaux de démarrage sont définis dans le dossier /etc/rc.d. Examinons les parties importante de ce dossier :

Création du script

Pour créer un service le meilleur moyen est de se baser sur le script d'un service existant. Prenons par exemple le service samba et éditons le fichier /etc/init.d/smb.

 #!/bin/sh
 #
 # chkconfig: - 91 35 #Numero      d'ordre de démarrage et d'arrêt
 # description: Starts and stops      the Samba smbd and nmbd daemons \
 # used to provide SMB network services. #permet de      décrire le service
 # Source function library.
 if [ -f /etc/init.d/functions ] ; then 
 . /etc/init.d/functions
 elif [ -f /etc/rc.d/init.d/functions ] ; then
 . /etc/rc.d/init.d/functions
 else
 exit 0
 fi   
 # Source networking configuration.	     #vérifie la présence du réseau
 . /etc/sysconfig/network   
 # Check that networking is up.
 [ ${NETWORKING} = "no" ] && exit 0   
 # Check that smb.conf exists.
 [ -f /etc/smb.conf ] || exit 0
 RETVAL=0
 start() { #Décrit ce qui va étre lancé au démarrage
 echo      -n "Starting SMB services: "	     #afficher au démarrage
 daemon smbd -D #fonction permettant l'affichage de OK si tout va bien
 RETVAL=$? #script à exécuter
 echo
 echo -n "Starting NMB services: "
 daemon nmbd -D 
 RETVAL2=$?
 echo
 [ $RETVAL -eq 0 -a $RETVAL2 -eq 0 ] && touch /var/lock/subsys/smb      || \
 RETVAL=1
 return $RETVAL
 } 
 stop() { #Décrit ce qui va étre lancé à l'arrêt
 echo -n "Shutting down SMB services:      " #afficher à l'arrêt
 killproc smbd	     #fonction permettant l'affichage de OK si tout va bien
 RETVAL=$? #script à exécuter
 echo
 echo -n "Shutting down NMB services: "
 killproc nmbd
 RETVAL2=$?
 [ $RETVAL -eq 0 -a $RETVAL2 -eq 0 ] && rm -f /var/lock/subsys/smb
 echo ""
 return $RETVAL
 } 
 restart() { #Sert à redémarrer le service
 stop
 start
 } 
 reload() { #permet de recharger les fichier de config du service
 echo -n "Reloading smb.conf file: "
 killproc smbd -HUP
 RETVAL=$?
 echo
 return $RETVAL
 } 
 mdkstatus() { #permet d'afficher l'état du service
 status smbd
 status nmbd
 } 
 case "$1" in
 start)
 start
 ;;
 stop)
 stop
 ;;
 restart)
 restart
 ;;
 reload)
 reload
 ;;
 status)
 mdkstatus
 ;;
 condrestart)
 [ -f /var/lock/subsys/smb ] && restart || :
 ;;
 *)
 echo "Usage: $0 {start|stop|restart|status|condrestart}"
 exit 1
 esac
 exit $?

La ligne « chkconfig: - 91 35 » permet de définir dans la position du script au démarrage et à l'arrêt du système. Le chiffre « 91 » place le script au rang 91 dans les niveau 1,2,3 et 5. Le chiffre « 35 » place le script au rang 35 dans les niveau 0 et 6.

La ligne description permet de décrire à quoi sert le démon. Ces lignes sont utilisées dans l'utilitaire « setup » quand on appuis sur F1 dans la liste des services.

Examinons plus en détail la partie « Start » :

 start() {

 echo -n "Starting SMB services: " 
 daemon smbd      -D 
 RETVAL=$? 
 echo
 echo -n "Starting      NMB services: "
 daemon nmbd -D 
 RETVAL2=$?
 echo
 [ $RETVAL -eq 0 -a $RETVAL2 -eq 0 ] && touch /var/lock/subsys/smb      || \
 RETVAL=1
 return $RETVAL
 } 

La ligne « echo -n "Starting SMB services: " » permet de définir ce qui va être vu au démarrage du système. La commande « daemon »
permet l'affichage du OK si le démon est exécuté avec succés.

Je vous propose de copier le fichier /etc/init.d/smb en /etc/init.d/rebold. Et de modifier le fichier rebold comme suit. Il décrit comment lancer le script rebol « script.r » qui ce trouve dans /usr/bin.

#!/bin/sh
#
# rebold Ce script permet de lancer notre démon écrit en Rebol
#
# chkconfig: - 80 30
# description: Notre démon Rebol
# processname: rebold
# pidfile: /var/run/rebold.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
RETVAL=0
# See how we were called.
case "$1" in
start)
# Start daemons.
echo -n "Starting rebol deamon: "
daemon /usr/bin/script.r $([ "$DAEMON" =      yes ] && echo -bd) \
$([ -n "$QUEUE" ] && echo -q$QUEUE)
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/rebold
;;
stop)
# Stop daemons.
echo -n "Shutting down rebol deamon: "
killproc rebold
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/netsrv
;;
restart|reload)
$0 stop
$0 start
RETVAL=$?
;;
status)
status rebold
RETVAL=$?
;;
*)
echo "Usage: rebold {start|stop|restart|status}"
exit 1
esac
exit $RETVAL  

Voilà le service est prêt à fonctionner. Il faut maintenant le déclarer dans les services.

Gestion des services

Pour tester votre service allez dans /etc/init.d/ et tapez :

 ./rebold start  
 ./rebold restart
 ./rebold status
 ./rebold stop

Si tous va bien votre script de service est prêt. Il ne vous reste plus qu'à l'initialiser dans les services. Pour cela tapez la commande :

 $chkconfig --add rebold

Cette commande crée automatiquement les liens symboliques contenus dans les dossier rcX.d. Allez dans « setup » et « services » pour vérifier qu'il a bien pris en compte votre service. Essayez la touche F1 pour voir la description de votre service. Pour tester le service tapez :

$service rebold start  
$service rebold stop

Rebootez votre machine pour vérifier si tout va bien.

Conclusion

Votre service est maintenant opérationnel. Cette méthode et beaucoup plus efficace que de mettre le script dans inittab car elle permet de profiter de tous les outils de gestion de service de Linux (commande « service <nomService> action »). Elle permet aussi d'effectuer des actions à l'arrêt du service et permet d'arréter le service proprement. En effet dans le cas de l'inittab votre démon sera arrêté par un kill.

 

Emmanuel Sterbac

Retour