Créer le script rc

Le premier script principal de démarrage est le script /etc/init.d/rc. Un nouveau fichier /etc/init.d/rc est créé, contenant ce qui suit:



cat > rc << "EOF"
#!/bin/sh
# Debut de /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@videotron.ca

#
# Inclure les 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 raison
# quelconque, par un appel a evaluate_retval ou un controle d'erreur,
# quel qu'il soit.
#

print_error_msg()
{

        echo
        $FAILURE
        echo -n "Vous ne devriez pas lire ce message d'erreur. Il "
        echo "signifie qu'une erreur imprevue "
        echo -n "s'est produite et que le sous-script $i s'est termine "
        echo "avec la valeur de retour "
        echo -n "$error_value, pour une raison inconnue. Si vous "
        echo "arrivez a rapprocher cette "
        echo -n "erreur d'un bogue dans un des fichiers fournis dans "
        echo "ce livre, merci "
        echo -n "de nous en informer a lfs-discuss@linuxfromscratch.org"
        $NORMAL
        echo
        echo
        echo "Appuyez sur une touche pour continuer..."
        read
}

#
# Si vous decommentez la variable debug ci-dessous, aucun des scripts
# ne sera execute; seuls le nom du script et ses parametres seront
# affiches a l'ecran, pour que vous puissiez voir comment les scripts
# sont appeles par rc.
#

# Decommenter la ligne suivante pour deboguage.
# 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, determiner les niveaux d'execution actuel et precedent.
# La variable $RUNLEVEL est renseignee par init pour tous ses enfants.
# Ce script s'execute en tant que fils d'init.
#

runlevel=$RUNLEVEL

#
# Recuperer le premier argument. Positionner le nouveau niveau 
# d'execution 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 <niveau d'execution>" >&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 positionnerons 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 oui, recuperer d'abord tous les scripts K* de ce nouveau
# 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, determiner son chemin d'acces complet
#
            previous_start=/etc/rc$previous.d/S[0-9][0-9][0-9]$suffix
#
# S'il n'y avait pas de niveau d'execution precedent, il se peut que
# quelque chose ait ete demarre dans rcS.d (niveau sysinit); 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'existent 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 n'a pas
# fonctionne avec le controle d'erreur inclus dans le script. La fonction
# print_error_msg sera appelee et le message avec la valeur de retour du
# script K sera affiche a l'ecran.
#

                        if [ $error_value != 0 ]
                        then
                                print_error_msg 
                        fi

                done
        fi

#
# Maintenant, lancer 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édent,
# 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 n'y 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 n'a pas
# fonctionne dans le controle d'erreur du script. La fonction 
# print_error_msg sera appelee et le message avec la valeur de retour du
# script K sera affiche 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 n'a pas
# fonctionne dans le controle d'erreur du script. La fonction 
# print_error_msg sera appelee et le message avec la valeur de retour du
# script K sera affiche a l'ecran.
#

                                if [ $error_value != 0 ]
                                then
                                        print_error_msg
                                fi
                                ;;
                esac
        done
fi

# Fin de /etc/init.d/rc
EOF