Service complet

De wiki.nexiat.fr
(Redirigé depuis Service complet2)
Aller à la navigation Aller à la recherche
Fiche express
Domaine Script d'init SysV complet, basé sur la bibliothèque système
Emplacement /etc/init.d/<nom>
Bibliothèque /etc/init.d/functions (daemon, killproc, status)
Squelette vierge Service generique
Voir aussi Init · Chkconfig · Systemctl

Service complet documente le motif d'un script d'init SysV complet, appuyé sur la bibliothèque de fonctions fournie par la distribution (/etc/rc.d/init.d/functions sur RHEL/CentOS), qui prend en charge le formatage de sortie standard ([ OK ]/[FAILED]), le lancement en tant que démon (daemon) et son arrêt propre (killproc). C'est la forme la plus robuste des scripts d'init SysV présentés dans cette branche — voir Service generique pour un squelette vide, et Service generique3 pour un style alternatif sans bibliothèque système (applications lancées via su - user).

Deux variantes de ce motif ont existé : un exemple concret pour un service réel (nrpe), et une version généralisée à variables pour être dupliquée vers un autre service. Elles sont regroupées ici — la seconde n'est qu'une paramétrisation de la première, pas un motif différent.

Version 1 : exemple concret (nrpe)

#!/bin/sh
#
# nrpe          Démarre/arrête nrpe.
#
# chkconfig: - 80 30
# description: nrpe est un démon pour un serveur Nagios distant, \
#              exécutant les plugins Nagios sur cet hôte.
# processname: nrpe

# Bibliothèque de fonctions système
if [ -f /etc/rc.d/init.d/functions ]; then
    . /etc/rc.d/init.d/functions
elif [ -f /etc/init.d/functions ]; then
    . /etc/init.d/functions
elif [ -f /etc/rc.d/functions ]; then
    . /etc/rc.d/functions
fi

# Configuration réseau
. /etc/sysconfig/network

# Configuration propre à nrpe (variables d'environnement, options)
if [ -f /etc/sysconfig/nrpe ]; then
    . /etc/sysconfig/nrpe
fi

[ "${NETWORKING}" = "no" ] && exit 0

NrpeBin=/opt/nagios/sbin/nrpe
NrpeCfg=/opt/nagios/etc/nrpe.cfg
LockFile=/var/lock/subsys/nrpe

RETVAL=0

case "$1" in
    start)
        echo -n "Starting nrpe: "
        daemon $NrpeBin -c $NrpeCfg -d $NRPE_SSL_OPT
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch $LockFile
        ;;
    stop)
        echo -n "Shutting down nrpe: "
        killproc nrpe
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && rm -f $LockFile
        ;;
    restart)
        $0 stop
        $0 start
        ;;
    reload)
        echo -n "Reloading nrpe"
        killproc nrpe -HUP
        RETVAL=$?
        echo
        ;;
    status)
        status nrpe
        RETVAL=$?
        ;;
    *)
        echo "Usage: nrpe {start|stop|restart|reload|status}"
        RETVAL=2
esac

exit $RETVAL

APPDIR (chemin d'installation applicative de l'exemple d'origine) a été remplacé ici par /opt/nagios, un chemin conventionnel générique.

Version 2 : template paramétré

Même motif, généralisé avec des variables pour être dupliqué vers n'importe quel démon similaire sans réécrire toute la logique start/stop :

#!/bin/sh
#
# service       Description de mon service
#
# chkconfig: - 80 30
# description:
# processname:

if [ -f /etc/rc.d/init.d/functions ]; then
    . /etc/rc.d/init.d/functions
elif [ -f /etc/init.d/functions ]; then
    . /etc/init.d/functions
elif [ -f /etc/rc.d/functions ]; then
    . /etc/rc.d/functions
fi

. /etc/sysconfig/network

#####################################
#### VARIABLES ET CONFIG
#####################################
AppName=MonApp
DirHome=/opt/MonApp
OWNER=mon_utilisateur

if [ -f "/etc/sysconfig/${OWNER}" ]; then
    . "/etc/sysconfig/${OWNER}"
fi

[ "${NETWORKING}" = "no" ] && exit 0

AppBin=/opt/${AppName}/sbin/${AppName}
AppCfg=/opt/${AppName}/etc/${AppName}.cfg
LockFile=/var/lock/subsys/${AppName}

RETVAL=0

case "$1" in
    start)
        echo -n "Starting ${AppName}: "
        daemon $AppBin -c $AppCfg
        daemon su - "${OWNER}" -c "${DirHome}/bin/lancement.sh"
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch $LockFile
        ;;
    stop)
        echo -n "Shutting down ${AppName}: "
        killproc ${AppName}
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && rm -f $LockFile
        ;;
    restart)
        $0 stop
        $0 start
        ;;
    reload)
        echo -n "Reloading $AppName"
        killproc ${AppName} -HUP
        RETVAL=$?
        echo
        ;;
    status)
        status ${AppName}
        RETVAL=$?
        ;;
    *)
        echo "Usage: ${AppName} {start|stop|restart|reload|status}"
        RETVAL=2
esac

exit $RETVAL

Différences avec la version 1, à noter si vous partez de ce template pour un nouveau service :

  • les chemins binaire/config/lock sont construits à partir de ${AppName} au lieu d'être en dur — un seul nom à changer en tête de fichier.
  • une deuxième ligne daemon su - ... a été ajoutée dans start() pour illustrer le cas d'une application lancée sous un utilisateur dédié (OWNER) plutôt qu'en root — pattern détaillé côté Service generique3.
  • la ligne d'origine gardait -d $NRPE_SSL_OPT recopiée de l'exemple nrpe alors que ce template n'a plus rien à voir avec nrpe — variable orpheline, sans effet pour un autre service (elle n'est jamais définie ici) ; retirée dans la version ci-dessus, à remplacer par les options réelles du démon concerné.
  • deux appels daemon dans start() ne partagent pas le même code retour dans $RETVAL (seul le second est capturé) — à garder en tête si le premier peut échouer silencieusement.

Enregistrement et activation

Comme tout script SysV, il doit être déposé dans /etc/init.d/, rendu exécutable, puis enregistré et activé via Chkconfig :

chmod +x /etc/init.d/monapp
chkconfig --add monapp
chkconfig monapp on

Sur un système avec systemd (RHEL7+, Debian 9+), on préfère aujourd'hui écrire une unit systemd plutôt qu'un script SysV — voir Systemctl : gestion des dépendances plus fine, journalisation intégrée (journalctl), pas besoin de réimplémenter le formatage de sortie ni le PID-tracking à la main.

Voir aussi

  • Service generique — squelette vide, sans implémentation
  • Service generique3 — variante sans bibliothèque système, application lancée via su - user
  • Service tomcat — trois versions d'un script d'init pour Tomcat, du plus simple au plus robuste
  • Chkconfig — enregistrement/activation d'un service SysV
  • Systemctl — équivalent moderne (systemd)