Créer un service sous Linux

Ou plus exactement sous des versions comme RedHat, Fedora, CentOs ou Oracle EL. Les services permettent de démarrer automatiquement des programmes comme VNC Server ou même une base de données lors du démarrage du système d’exploitation. Dans ce qui suit, vous trouverez comment créer un service et un exemple trouvé sur le web et légèrement modifié pour mes besoins personnels.
Avant tout, familiarisez vous avec l’initialisation de Linux. Ce document l’explique très simplement. Ensuite, il faut créer le script qui va gérer votre service. Ce script a les caractéristiques suivantes :

  • le nom du fichier script sera le nom du service
  • le script doit contenir 2 lignes dans ses commentaires d’entête dont la première ressemble à celle qui est écrite ci-dessous
    # chkconfig: 2345 20 80

    • le premier nombre définit les différents « level » dans lesquels le script doit s’exécuter,
    • le deuxième nombre indique la position de démarrage du service parmi les autres services (par exemple, vous devez démarrer un serveur FTP seulement après le réseau)
    • le troisième nombre indique la position d’arrêt du service parmi les autres (même remarque que pour le précédent ; gardez à l’esprit que les scripts d’arrêt sont exécutés lors des changements de « level » et que ça permet notamment de passer de init 5 à init 3.
  • La seconde ligne (qui peut être étendue sur d’autres lignes, si vous positionnez le caractère backslash () à la fin de la ligne) contient la description du service comme ci-dessous :
    # description: Start and Stop the Oracle Database with
    # the dbshut and dbstart scripts. Make sure you’ve
    # correctly set /etc/oratab entries with ‘Y’ at the end
  • Enfin le script prend un paramètre en entrée. Chacune des valeurs ci-dessous pour ce paramètre doivent être traitées :
    • start : démarre votre service
    • stop : arrête votre service
    • restart : arrête et redémarre votre service
    • condrestart : arrête et redémarre votre service seulement s’il est déjà démarré
    • status : renvoi le status de votre service (0 pour OK, 1 pour KO)

Exemple de script
Il existe un script /etc/init.d/functions qui contient un ensemble de fonctions très pratiques comme killproc qui tue le process dont le nom est passé en paramètre. Voici le script pour gérer Xvfb (encore utile !)

#!/bin/sh
#
# Startup script for Xvfb
#
# chkconfig: 2345 79 21
# description: Xvfb - virtual frame buffer
# processname: Xvfb
#
# Source function library.
. /etc/rc.d/init.d/functions
## See how we were called.
case "$1" in
start)
 echo -n "Starting Xvfb services: "
 Xvfb :1 -screen 0 800x600x8 &
 export DISPLAY=:1
 echo
 touch /var/lock/subsys/Xvfb
 ;;
stop)
 echo -n "Stopping Xvfb services: "
 killproc Xvfb
 echo
 rm -f /var/lock/subsys/Xvfb
 ;;
status)
 status Xvfb
 ;;
restart|reload)
 $0 stop
 $0 start
 ;;
condrestart)
 $0 status
 if [ $? -eq 0 ]; then
   $0 stop
   $0 start
 fi
 ;;
*)
 echo "Usage: xvfb {start|stop|status|restart}"
 exit 1
esac
exit 0

Enregistrer le script
Une fois que vous avez ajouté le script dans /etc/init.d (il doit s’appeler xvfb), vous devez :

  • Changer son propriétaire
  • Changez ses droits d’exécution
  • Ajouter le service aux autres services
  • Vérifier qu’il est bien à la place voulue en comparant par rapport aux autres
  • Changez l’état du service (on|off) en fonction du « level » voulu
  • Tester le service

Voici, dit autrement, comment réaliser ces opérations :

chown root root xvfb
chmod 755 xvfb
chkconfig --add xvfb
chkconfig --list |
grep -e  vncserver -e xvfb
xvfb            0:off   1:off   2:on ...
vncserver       0:off   1:off   2:off ...
chkconfig --level 24 xvfb off

Tester le script
Une fois le script enregistré, vérifiez que le service peut être démarré, arrêté, vérifié et que bien sur, qu’il fait son travail… Voici quelques exemples de commandes que vous pouvez utiliser à cet effet.

/sbin/service xvfb stop
/sbin/service xvfb status
/sbin/service xvfb start
ps -ef |grep Xvfb |grep -v grep
/sbin/service xvfb condrestart

Une fois effectué, vous pouvez vérifier que les liens qui correspondent au démarrage et a l’arrêt du service dans les différents « level » sont correctement définis. Naviguez dans le répertoire /etc et exécuter la commande suivante :

[root@kilian etc]# ls -ltr rc[0-6].d/*xvfb

Le résultat doit ressembler au suivant. Les liens commençant par K indiquent les « level » pour lesquels le service est arrêté, alors que les liens commençant par S, indiquent les « level » pour lesquels il est démarré :

lrwxrwxrwx  1 root root 14 Jun 27 21:38 rc6.d/K21xvfb -> ../init.d/xvfb
lrwxrwxrwx  1 root root 14 Jun 27 21:38 rc5.d/S79xvfb -> ../init.d/xvfb
lrwxrwxrwx  1 root root 14 Jun 27 21:38 rc1.d/K21xvfb -> ../init.d/xvfb
lrwxrwxrwx  1 root root 14 Jun 27 21:38 rc0.d/K21xvfb -> ../init.d/xvfb
lrwxrwxrwx  1 root root 14 Jun 27 21:41 rc4.d/K21xvfb -> ../init.d/xvfb
lrwxrwxrwx  1 root root 14 Jun 27 21:41 rc3.d/K21xvfb -> ../init.d/xvfb
lrwxrwxrwx  1 root root 14 Jun 27 21:41 rc2.d/K21xvfb -> ../init.d/xvfb

Utiliser le script.
Vous pouvez utiliser la commande init et redémarrer votre serveur de test pour vous assurer du bon fonctionnement de votre nouveau service.
Voila… Maintenant, pourquoi pas démarrer VNC Server en level 3 ? Plus généralement, pourquoi ne pas utiliser que les services dont vous avez besoin et désactiver les autres ? Pourquoi continuer de démarrer les mêmes processus à la main ?
Un dernier commentaire.
Si vous utilisez le display :1 pour Xvfb, comme dans mon script, Cf ci-dessous :

Xvfb :1 -screen 0 800x600x8 &

Alors il n’est plus utilisable par VNC Server. Pour contourner ce problème utiliser le display :2 ou :3 dans VNC Server. Le fichier /etc/sysconfig/vncserver ressemble donc à ceci, plutôt qu’à celui décrit dans mon post précédent à propos de VNC :

VNCSERVERS="2:oracle"
VNCSERVERARGS[2]="-geometry 1280x1024 -depth 16 -nolisten tcp"

-GarK!