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 :
0 Arrêt du système 1 Mode mono-utilisateur (permet la maintenance du système) 2 Mode multi-utilisateurs sans réseau 3 Mode multi-utilisateurs complet 4 Inutilisé 5 Mode multi-utilisateurs complet avec démarrage automatique de X 6 RedémarrageLe 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 :
- init.d : Ce dossier contient tous les scripts qui permettent le démarrage ou l'arrêt de tous les services du système.
- RcX.d : (X est le niveau de démarrage) C'est dossier contiennent des liens symboliques qui pointent sur les scripts de init.d. C'est liens sont de la forme suivante :
- KXX<nomService>
- SXX<nomService>
- « K » veut dire que le service n'est pas exécuté dans un niveau de démarrage(1,2,3,5) et qu'il est arrêté dans un niveau d'arrêt(0,6). « S » exprime que le service va être exécuté dans ce niveau. « XX » est un numéro d'ordre qui permet de classer dans quelle ordre les scripts vont s'exécuter.
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/functionselif [ -f /etc/rc.d/init.d/functions ] ; then. /etc/rc.d/init.d/functionselseexit 0fi# 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 0RETVAL=0start() { #Décrit ce qui va étre lancé au démarrageecho -n "Starting SMB services: " #afficher au démarragedaemon smbd -D #fonction permettant l'affichage de OK si tout va bienRETVAL=$? #script à exécuterechoecho -n "Starting NMB services: "daemon nmbd -DRETVAL2=$?echo[ $RETVAL -eq 0 -a $RETVAL2 -eq 0 ] && touch /var/lock/subsys/smb || \RETVAL=1return $RETVAL}stop() { #Décrit ce qui va étre lancé à l'arrêtecho -n "Shutting down SMB services: " #afficher à l'arrêtkillproc smbd #fonction permettant l'affichage de OK si tout va bienRETVAL=$? #script à exécuterechoecho -n "Shutting down NMB services: "killproc nmbdRETVAL2=$?[ $RETVAL -eq 0 -a $RETVAL2 -eq 0 ] && rm -f /var/lock/subsys/smbecho ""return $RETVAL}restart() { #Sert à redémarrer le servicestopstart}reload() { #permet de recharger les fichier de config du serviceecho -n "Reloading smb.conf file: "killproc smbd -HUPRETVAL=$?echoreturn $RETVAL}mdkstatus() { #permet d'afficher l'état du servicestatus smbdstatus nmbd}case "$1" instart)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 1esacexit $?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 -DRETVAL=$?echoecho -n "Starting NMB services: "daemon nmbd -DRETVAL2=$?echo[ $RETVAL -eq 0 -a $RETVAL2 -eq 0 ] && touch /var/lock/subsys/smb || \RETVAL=1return $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/networkRETVAL=0# See how we were called.case "$1" instart)# 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 reboldRETVAL=$?echo[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/netsrv;;restart|reload)$0 stop$0 startRETVAL=$?;;status)status reboldRETVAL=$?;;*)echo "Usage: rebold {start|stop|restart|status}"exit 1esacexit $RETVALVoilà 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 stopSi 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 reboldCette 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 stopRebootez 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