Service generique3
| Fiche express | |
|---|---|
| Domaine | Script d'init SysV pour une application lancée via un utilisateur dédié |
| Emplacement | /etc/init.d/<nom>
|
| Style | sans bibliothèque système, su - user -c script
|
| Exemple concret | Service tomcat (même motif, appliqué à Tomcat) |
| Voir aussi | Service complet · Chkconfig |
Service générique 3 est un motif de script d'init SysV pour une application qui fournit ses propres scripts de démarrage/arrêt (startup.sh/shutdown.sh, typiquement une application Java) et doit tourner sous un compte utilisateur dédié plutôt qu'en root. Contrairement à Service complet, ce style n'utilise pas la bibliothèque /etc/init.d/functions de la distribution : le lancement passe par su - user -c ... et l'état est vérifié « à la main » avec ps/grep plutôt qu'avec status/killproc. C'est exactement le motif utilisé par Service tomcat (version 1), généralisé ici à n'importe quelle application du même style.
Script
#!/bin/bash
#
# chkconfig: 345 85 15
# description: service APPLICATION
## Variables
APP_NAME=nom_app
DIR_HOME=/opt/nom_app
OWNER=utilisateur_dedie
## Fonctions
start() {
echo -n "Starting ${APP_NAME}: "
su - "${OWNER}" -c "${DIR_HOME}/bin/startup.sh"
sleep 2
}
stop() {
echo -n "Stopping ${APP_NAME}: "
su - "${OWNER}" -c "${DIR_HOME}/bin/shutdown.sh"
}
status() {
numproc=$(ps -ef | grep "${APP_NAME}" | grep -v grep | wc -l)
if [ "$numproc" -gt 0 ]; then
echo "${APP_NAME} is running..."
else
echo "${APP_NAME} is stopped..."
fi
}
case "$1" in
start) start ;;
stop) stop ;;
restart) stop; start ;;
status) status ;;
*)
echo "Usage: ${APP_NAME} {start|stop|restart|status}"
exit 1
;;
esac
Corrections apportées par rapport au script d'origine :
status()filtrait sur$OWNER(le nom de l'utilisateur système) plutôt que sur le nom du processus applicatif — imprécis dès que cet utilisateur fait tourner autre chose que l'application visée (un autre process, un shell interactif...). Corrigé pour filtrer sur${APP_NAME}, plus spécifique (à adapter selon ce qui identifie réellement le process dansps— un nom de classe Java, un chemin...).- variables non quotées dans les appels
su— corrigé, important siDIR_HOMEcontient un espace. - le cas
*)se terminait sansexitdans l'original — ajoutéexit 1.
Limite : pas de vérification que le démarrage a réussi
start() lance startup.sh puis attend 2 secondes fixes sans vérifier ensuite que le process a effectivement démarré (contrairement à un script basé sur daemon, voir Service complet, qui capture un code retour). Pour une vérification fiable, appeler status après le sleep et faire échouer start si le process n'apparaît pas.
Voir aussi
- Service tomcat — application concrète de ce motif à Tomcat, avec deux versions plus robustes
- Service complet — motif alternatif basé sur la bibliothèque système (
daemon/killproc) - Service generique — squelette vide
- Chkconfig — enregistrement/activation du service