Service complet
| 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 dansstart()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_OPTrecopié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
daemondansstart()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)