Le premier script principal de démarrage est le script /etc/init.d/rc. Créez un nouveau fichier /etc/init.d/rc contenant ce qui suit:
cat > rc << "EOF"
#!/bin/sh
# Begin /etc/init.d/rc
#
# par Jason Pearce - jason.pearce@linux.org
# Modifie par Gerard Beekmans - gerard@linuxfromscratch.org
# print_error_msg base sur une idee de Simon Perreault - nomis80@yahoo.com
#
# Inclusion des fonctions declarees dans le fichier /etc/init.d/functions
#
source /etc/init.d/functions
#
# La fonction print_error_msg affiche un message d'erreur lorsqu'une
# erreur imprevue se produit et n'a pas ete interceptee pour une quelconque
# raison par un appel a evaluate_retval ou un quelconque controle d'erreur
#
print_error_msg()
{
echo
$FAILURE
echo -n "Vous ne devriez pas lire ce message d'erreur. Il "
echo "signifie qu'une erreur imprevue s'est produite et que "
echo -n "le sous-script $i s'est termine avec la valeur de "
echo "retour $error_value pour une raison inconnue. Si vous "
echo -n "etes capable de trouver la cause de cette erreur "
echo "dans l'un des fichiers fournis dans ce livre, merci "
echo -n "de nous en informer a lfs-discuss@linuxfromscratch.org"
$NORMAL
echo
echo
echo "Appuyer sur une touche pour continuer..."
read
}
#
# Si vous decommentez la variable debug ci-dessous, aucun des scripts
# ne sera execute, seul le nom du script et ses parametres seront
# affiches a l'ecran afin de voir comment les scripts sont appeles par rc."
#
# Decommenter la ligne suivante pour debogage
# debug=echo
#
# Demarrage de script ou programme
#
startup() {
$debug $*
}
#
# Ignorer CTRL-C seulement dans ce shell, de telle sorte que nous
# puissions interrompre les sous-processus.
#
trap ":" INT QUIT TSTP
#
# Maintenant, determinons les niveaux d'execution actuel et precedent.
# La variable $RUNLEVEL est renseignee par init pour tous ses fils.
# Ce script s'execute en tant que fils d'init.
#
runlevel=$RUNLEVEL
#
# Recuperation du premier argument. Positionner le nouveau niveau
# d'execution en accord avec cet argument. Si aucun niveau d'execution
# n'a ete passe a ce script, nous ne changeons pas les niveaux d'execution.
#
[ "$1" != "" ] && runlevel=$1
if [ "$runlevel" = "" ]
then
echo "Usage: $0 <runlevel>" >&2
exit 1
fi
#
# La meme chose pour $PREVLEVEL (cf. ci-dessus $RUNLEVEL). previous sera
# renseigne avec le niveau d'execution precedent. Si $PREVLEVEL n'est pas
# positionne, cela signifie qu'il n'y avait pas de niveau d'execution
# precedent et nous mettrons previous à N.
#
previous=$PREVLEVEL
[ "$previous" = "" ] && previous=N
export runlevel previous
#
# Y a-t'il un repertoire rc pour le nouveau niveau d'execution ?
#
if [ -d /etc/rc$runlevel.d ]
then
#
# Si rc existe pour le nouveau niveau d'execution , recuperer d'abord
# tous les scripts K* de ce niveau d'execution.
#
if [ $previous != N ]
then
for i in /etc/rc$runlevel.d/K*
do
[ ! -f $i ] && continue
#
# La variable suffix contiendra le nom du script sans le Kxxx initial
#
suffix=${i#/etc/rc$runlevel.d/K[0-9][0-9][0-9]}
#
# S'il y a un script de demarrage pour ce script K dans le niveau d'execution
# precedent, determinons son chemin d'acces complet
#
previous_start=/etc/rc$previous.d/S[0-9][0-9][0-9]$suffix
#
# S'il n'y a pas de niveau d'execution precedent, il se peut que quelque chose
# avait ete demarre dans rcS.d (niveau sysinit) aussi nous determinerons aussi
# le chemin pour cette possibilite.
#
sysinit_start=/etc/rcS.d/S[0-9][0-9][0-9]$suffix
#
# Arreter le service s'il y a un script de demarrage dans le niveau
# precedent ou dans le niveau sysinit. Si previous_start ou sysinit_start
# n'existe pas, la commande 'continue' est lancee, ce qui conduit le
# script a interrompre cette iteration de la boucle for et a poursuivre
# avec l'iteration suivante.
# Cela revient a ce qu'il n'execute pas les commandes apres les deux
# lignes suivantes et recommence au debut de cette boucle for. Cf.
# man bash pour plus d'information a ce sujet.
#
[ ! -f $previous_start ] &&
[ ! -f $sysinit_start ] && continue
#
# Si nous trouvons previous_start ou sysinit_start, lancer le
# script K
#
startup $i stop
error_value=$?
#
# Si la valeur de retour du script n'est pas 0, quelque chose est alle
# de travers avec le controle d'erreur inclus dans le script. La fonction
# print_error_msg sera appelee et le message plus la valeur de retour du
# script K seront affiches a l'ecran.
#
if [ $error_value != 0 ]
then
print_error_msg
fi
done
fi
#
# Maintenant nous lançons les scripts START pour ce niveau d'execution.
#
for i in /etc/rc$runlevel.d/S*
do
[ ! -f $i ] && continue
if [ $previous != N ]
then
#
# Trouver le script de demarrage dans le niveau d'execution precédant
# et stopper le script dans ce niveau d'execution.
#
suffix=${i#/etc/rc$runlevel.d/S[0-9][0-9][0-9]}
stop=/etc/rc$runlevel.d/K[0-9][0-9][0-9]$suffix
previous_start=/etc/rc$previous.d/S[0-9][0-9][0-9]$suffix
#
# S'il y a un script de demarrage dans le niveau precedent et pas de script
# d'arret dans ce niveau, nous n'avons pas a relancer le service; interrompre
# cette iteration et demarrer la suivante.
#
[ -f $previous_start ] && [ ! -f $stop ] &&
continue
fi
case "$runlevel" in
0|6)
#
# les niveaux 0 et 6 sont les niveaux d'arret (halt) et de redemarrage (reboot).
# Nous ne demarrons reellement rien si bien que nous faisons l'appel avec le
# parametre 'stop'.
#
startup $i stop
error_value=$?
#
# Si la valeur de retour du script n'est pas 0, quelque chose est alle
# de travers dans le controle d'erreur du script. La fonction
# print_error_msg sera appelee et le message plus la valeur de retour du
# script K seront affiches a l'ecran.
#
if [ $error_value != 0 ]
then
print_error_msg
fi
;;
*)
startup $i start
error_value=$?
#
# Si la valeur de retour du script n'est pas 0, quelque chose est alle
# de travers dans le controle d'erreur du script. La fonction
# print_error_msg sera appelee et le message plus la valeur de retour du
# script K seront affiches a l'ecran.
#
if [ $error_value != 0 ]
then
print_error_msg
fi
;;
esac
done
fi
# End /etc/init.d/rc
EOF
Précédent | Sommaire | Suivant |
Création des répertoires | Niveau supérieur | Création du script rcS |