Création du script rc

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