Service generique3

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
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 dans ps — un nom de classe Java, un chemin...).
  • variables non quotées dans les appels su — corrigé, important si DIR_HOME contient un espace.
  • le cas *) se terminait sans exit dans 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