Lancement d’un script au démarrage de Linux

Dans la gestion d’un serveur sous Linux, il peut s’avérer pratique que ce-dernier puisse redémarrer en même temps que la machine se lance. Ainsi, si la machine hébergeant le serveur doit être redémarrée (par exemple au milieu de la nuit suite à une opération de maintenance), on souhaite que son serveur redémarre également en même temps afin d’être opérationnel le lendemain, ou alors tout simplement pour exécuter des tâches quotidiennes.
Cet article décrit la procédure pour exécuter un script au moment du démarrage de la machine. Et dans notre cas, ce script … démarrera le serveur !

Exemple de script

Le script à rédiger est très simple. Il va contenir uniquement l’instruction pour démarrer le serveur. Dans cet exemple, il s’agit d’un serveur Jboss. Notre script, start.sh, contiendra donc :

1
/appli/jboss/bin/jboss start

On peut bien sûr démarrer d’autres composants dans ce même script : par exemple on peut souhaiter démarrer le serveur de bases de données avant le démarrage du serveur jboss afin que les applications qui ont besoin d’accéder à la base pour démarrer trouvent ce dont ils ont besoin au moment de leur démarrage.
Il est également possible d’écrire un message dans un fichier de logs afin de contrôler que le script s’est bien exécuté :

LOG=$HOME/info.log
echo `date +'%Y-%m-%d %H:%M:%S'` BEGIN $0 >>$LOG

Cela écrire dans le fichier info.log :

1
2014-04-12 01:30:50 BEGIN start.sh

Enfin, on peut écrire un script identique pour arrêter proprement le serveur jboss (stop.sh) au moment de l’arrêt de la machine Linux.

1
/appli/jboss/bin/jboss stop

On pensera dans ce cas à arrêter le serveur d’application avant d’arrêter la base de données afin de respecter un ordonnancement logique.

Création d’un script chapeau

Pour que nos scripts s’exécutent, il est nécessaire de créer un script « chapeau » que l’on pourra appeler avec les paramètres « start » et « stop » et qui se chargera d’appeler nos deux scripts en fonction de ce paramètre. Voici un exemple de script chapeau monScript.sh :

1
2
3
4
5
6
7
8
9
10
OWNER=owner

case "$1" in
   'start')
      su - $OWNER -c "/home/owner/start.sh"
   ;;
   'stop')
      su - $OWNER -c "/home/owner/stop.sh"
   ;;
esac

Si ce script est appelé avec le paramètre « start », il se chargera de démarrer notre serveur d’application. S’il est appelé avec le paramètre « stop », il arrêtera au contraire le serveur. Il s’agit donc d’un point d’entrée unique pour contrôler l’arrêt/relance de nos serveurs.

Chainage des scripts au démarrage

C’est là que l’on entre dans le vif du sujet : comment faire en sorte que la machine exécute ce script chapeau au moment de son reboot ?
Pour se faire, on va en fait configurer un daemon au démarrage de la machine qui se chargera d’exécuter ce script.
Pour cela, on place le script chapeau dans /etc/init.d sur la machine Linux.
Ensuite, tout se passe dans les répertoires /etc/rcX.d, avec X les niveaux d’exécutions (runlevel). Ces niveaux sont au nombre de 7, numérotés de 0 à 6 (rc0.d, rc1.d, …, rc6.d), et correspondent à des actions que la machine doit effectuer lorsqu’elle redémarre. Chaque couche est liée à un mode de démarrage de la machine :

0: arrête l’ordinateur
1: mode simple utilisateur
2: mode multi-utilisateur sans réseau
3: mode multi-utilisateur avec réseau
4: réservé pour la personnalisation, sinon identique à 3
5: identique à 4, il est habituellement utilisé pour la connexion GUI
6: redémarre l’ordinateur

Le niveau d’exécution par défaut est 3. En cas d’échec avec le redémarrage d’un niveau, on pourra relancer la machine avec un niveau inférieur, ce qui pourra permettre de débugger le niveau en question.

A chaque appel d’un niveau, la machine appelle l’ensemble des liens contenus dans ces répertoires. On va donc créer un lien symbolique dans le répertoire rc3.d qui va se charger d’appeler notre script chapeau avec le paramètre « start » et de lancer le démarrage de nos serveurs. De même, on va créer un lien symbolique dans le répertoire rc0.d qui aura pour rôle d’appeler notre script chapeau avec le paramètre « stop », et d’arrêter proprement les serveurs avant l’arrêt de la machine. Ces liens symboliques pointeront vers le même script.

Mais comment ce lien va-t-il permettre du coup de choisir entre le paramètre « start » et le paramètre « stop » ?
C’est tout simplement parce que ce lien suit une convention de nommage bien précise : s’il commence par la lettre « S », il appellera le script avec le paramètre « start ». S’il commence par la lettre « K », il appellera le script avec le paramètre « stop ».

Enfin, pour être sûr que les différents services dont on a besoin pour exécuter le script ont bien été démarrés (par exemple, la fonction qui doit afficher la date dans le fichier de log) avant le lancement de notre script, on va ajouter dans ce lien un numéro, en l’occurrence élevé (ici : 99), qui signifiera que ce script devra s’exécuter en dernier. Dans la même logique, on privilégiera de petits numéros (par exemple 02) au moment de l’arrêt afin que ce script s’exécute avant l’arrêt des différents services de la machine (afin de pouvoir afficher la date dans notre fichier de log par exemple).

Si on se résume, on va donc lancer les commandes suivantes pour créer les liens symboliques :

1
2
ln -s /etc/init.d/monScript /etc/rc.d/rc0.d/K02monScript
ln -s /etc/init.d/monScript /etc/rc.d/rc3.d/S99monScript

Pour faire les choses proprement, il est en fait bien de réaliser cette opération dans les autres niveaux également. Par exemple, le niveau 6 correspond au redémarrage de la machine. On cherchera donc à arrêter nos serveurs pour ce niveau-là aussi :

1
ln -s /etc/init.d/monScript /etc/rc.d/rc6.d/K02monScript

De même, on pourra créer les liens suivants :

1
2
ln -s /etc/init.d/monScript /etc/rc.d/rc4.d/S99monScript
ln -s /etc/init.d/monScript /etc/rc.d/rc5.d/S99monScript

Conclusion

Finalement, pour chainer un script au démarrage de la machine, c’est assez simple :
– On rédige notre script que l’on place par exemple dans /home/owner
– On crée le script chapeau qui redirige simplement le paramètre d’appel vers le bon script (arrêt ou démarrage), et on le place dans /etc/init.d
– On crée les liens symboliques dans /etc/rcX.d en suivant la convention de nommage : K pour l’arrêt (niveau 0, 1 et 6) et S pour le démarrage (niveau 3, 4, 5)

Sources :
Fonctionnement des scripts de démarrage : http://lfs.traduc.org/view/lfs-6.1.1-fr/chapter07/usage.html
Lancer un script au démarrage : http://www.linuxpedia.fr/doku.php/opensuse/script_demarrage

VN:R_U [1.9.22_1171]
Rating: 0 (from 0 votes)
Share
Ce contenu a été publié dans Non classé. Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire