<Précédent | Table des matières | Suivant>
D.1. /etc/rc.d/init.d/rc
La rc script est le premier script appelé par init et lance le processus de démarrage.
#! / Bin / bash
##################################################### ########################
# Commencer rc
#
# Description : Script de contrôle de niveau d'exécution principal
#
# Auteurs : Gérard Beekmans - [email protected]
# : DJ Lucas - [email protected]
# Mise à jour : Bruce Dubbs - [email protected]
#
# Version : LFS 7.0
#
##################################################### ########################
. /lib/lsb/init-functions print_error_msg()
{
log_failure_msg
# $i est défini lors de l'appel
MSG="FAILURE :\n\nVous ne devriez pas lire ce message d'erreur.\n\n" MSG="${MSG}Cela signifie qu'une erreur imprévue s'est produite dans\n" MSG="${MSG}${ dans"
MSG="${MSG}qui s'est terminé avec une valeur de retour de ${error_value}.\n"
MSG="${MSG}Si vous êtes en mesure de retracer cette erreur à un bogue dans l'un des\n" MSG="${MSG}les fichiers fournis par le livre ${DISTRO_MINI},\n" MSG=" ${MSG}veuillez nous en informer à ${DISTRO_CONTACT}.\n" log_failure_msg "${MSG}"
log_info_msg "Appuyez sur Entrée pour continuer..." wait_for_user
}
check_script_status()
{
# $i est défini lors de l'appel si [ ! -f ${i} ]; alors
log_warning_msg "${i} n'est pas un lien symbolique valide." SCRIPT_STAT="1"
fi
si [ ! -x ${i} ]; alors
log_warning_msg "${i} n'est pas exécutable, ignoré." SCRIPT_STAT="1"
fi
}
Cours()
{
if [ -z $interactif ]; alors
${1} ${2}
retourner $?
fi
bien que vrai; faire
read -p "Exécuter ${1} ${2} (Oui/non/continuer) ? " -n 1 runit echo
cas ${runit} en c | C)
interactif=""
${i} ${2}
ret=${?} pause ;
;;
n | N)
retour 0
;;
y | O)
${i} ${2}
ret=${?} pause
;;
esac fait
retourner $ret
}
# Lisez tous les paramètres/remplacements locaux
[ -r /etc/sysconfig/rc.site ] && source /etc/sysconfig/rc.site
DISTRO=${DISTRO:-"Linux From Scratch"}
DISTRO_CONTACT=${DISTRO_CONTACT :-"[email protected] (Inscription requise)"} DISTRO_MINI=${DISTRO_MINI:-"LFS"}
IPROMPT=${IPROMPT:-"non"}
# Ces 3 signaux ne feront pas sortir notre script de trap "" INT QUIT TSTP
[ "${1}" != "" ] && runlevel=${1}
if [ "${runlevel}" == "" ]; then echo "Utilisation : ${0} " >&2 sortie 1
fi
précédent=${NIVEAU PRÉCÉDENT}
[ "${précédent}" == "" ] && précédent=N
si [ ! -d /etc/rc.d/rc${runlevel}.d ]; alors
log_info_msg "/etc/rc.d/rc${runlevel}.d n'existe pas.\n" sortie 1
fi
if [ "$runlevel" == "6" -o "$runlevel" == "0" ]; puis IPROMPT="non" ; Fi
# Remarque : Dans ${LOGLEVEL:-7}, c'est ':' 'dash' '7', pas moins 7 if [ "$runlevel" == "S" ]; alors
[ -r /etc/sysconfig/console ] && source /etc/sysconfig/console dmesg -n "${LOGLEVEL:-7}"
fi
if [ "${IPROMPT}" == "yes" -a "${runlevel}" == "S" ]; alors
# La longueur totale de la chaîne de bienvenue de la distribution, sans les codes d'échappement wlen=${wlen:-$(echo "Bienvenue dans ${DISTRO}" | wc -c )} welcome_message=${welcome_message:-"Bienvenue dans ${INFO }${DISTRO}${NORMAL}"}
# La longueur totale de la chaîne interactive, sans les codes d'échappement ilen=${ilen:-$(echo "Appuyez sur 'I' pour entrer dans le démarrage interactif" | wc -c )}
i_message=${i_message:-"Appuyez sur '${FAILURE}I${NORMAL}' pour entrer dans le démarrage interactif"}
# dcol et icol sont des espaces avant le message pour centrer le message
# À l'écran. time est le temps d'attente pour que l'utilisateur appuie sur une touche wcol=$(( ( ${COLUMNS} - ${wlen} ) / 2 ))
icol=$(( ( ${COLUMNS} - ${ilen} ) / 2 )) time=${itime:-"3"}
echo -e "\n\n"
echo -e "\\033[${wcol}G${welcome_message}" echo -e "\\033[${icol}G${i_message}${NORMAL}" echo ""
read -t "${itime}" -n 1 interactif 2>&1 > /dev/null
fi
# Faire des minuscules
[ "${interactive}" == "I" ] && interactive="i" [ "${interactive}" != "i" ] && interactive=""
# Lire le fichier d'état s'il existe depuis le niveau d'exécution S
[ -r /var/run/interactive ] && source /var/run/interactive
# Tenter d'arrêter tous les services démarrés par le niveau d'exécution précédent,
# et tué dans ce niveau d'exécution
if [ "${précédent}" != "N" ]; alors
pour i dans $(ls -v /etc/rc.d/rc${runlevel}.d/K* 2> /dev/null) faire
check_script_status
if [ "${SCRIPT_STAT}" == "1" ]; puis SCRIPT_STAT="0"
continuer
fi
suffix=${i#/etc/rc.d/rc$runlevel.d/K[0-9][0-9]} prev_start=/etc/rc.d/rc$previous.d/S[0-9][0-9]$suffix sysinit_start=/etc/rc.d/rcS.d/S[0-9][0-9]$suffix
if [ "${runlevel}" != "0" -a "${runlevel}" != "6" ]; alors
si [ ! -f ${prev_start} -a ! -f ${sysinit_start} ] ; then MSG="AVERTISSEMENT :\n\n${i} ne peut pas être "
MSG="${MSG}exécuté car il n'a pas été " MSG="${MSG} pas démarré dans le " MSG="${MSG} runlevel (${previous}) précédent." log_warning_msg "$MSG"
continuer
fi
fi
exécuter ${i} arrêter error_value=${?}
if [ "${error_value}" != "0" ]; puis print_error_msg ; fi fait
fi
if [ "${précédent}" == "N" ]; puis exportez IN_BOOT=1 ; Fi
if [ "$runlevel" == "6" -a -n "${FASTBOOT}" ]; puis touchez /fastboot
fi
# Démarrer toutes les fonctions de ce niveau d'exécution
pour i dans $( ls -v /etc/rc.d/rc${runlevel}.d/S* 2> /dev/null) faire
if [ "${précédent}" != "N" ]; alors suffixe=${i#/etc/rc.d/rc$runlevel.d/S[0-9][0-9]} stop=/etc/rc.d/rc$runlevel.d/K[0 -9][0-9]$suffixe prev_start=/etc/rc.d/rc$previous.d/S[0-9][0-9]$suffixe
[ -f ${prev_start} -a ! -f ${stop} ] && continuer
fi
check_script_status
if [ "${SCRIPT_STAT}" == "1" ]; puis SCRIPT_STAT="0"
continuer
fi
case ${runlevel} dans 0|6)
exécuter ${i} arrêter
;;
*)
Esac
exécuter ${i} démarrer
;;
valeur_erreur=${?}
if [ "${error_value}" != "0" ]; puis print_error_msg ; fi fait
# Stocke la variable interactive au passage du niveau d'exécution S et supprime si ce n'est pas le cas if [ "${runlevel}" == "S" -a "${interactive}" == "i" ]; alors
echo "interactive=\"i\"" > /var/run/interactive
d'autre
rm -f /var/run/interactive 2> /dev/null
fi
# Copiez le journal de démarrage uniquement lors du démarrage initial
if [ "${previous}" == "N" -a "${runlevel}" != "S" ]; puis cat $BOOTLOG >> /var/log/boot.log
# Marquer la fin du démarrage
echo "--------" >> /var/log/boot.log
# Supprimer le fichier temporaire rm -f $BOOTLOG 2> /dev/null
fi
# Fin rc
if [ "${error_value}" != "0" ]; puis print_error_msg ; fi fait
# Stocke la variable interactive au passage du niveau d'exécution S et supprime si ce n'est pas le cas if [ "${runlevel}" == "S" -a "${interactive}" == "i" ]; alors
echo "interactive=\"i\"" > /var/run/interactive
d'autre
rm -f /var/run/interactive 2> /dev/null
fi
# Copiez le journal de démarrage uniquement lors du démarrage initial
if [ "${previous}" == "N" -a "${runlevel}" != "S" ]; puis cat $BOOTLOG >> /var/log/boot.log
# Marquer la fin du démarrage
echo "--------" >> /var/log/boot.log
# Supprimer le fichier temporaire rm -f $BOOTLOG 2> /dev/null
fi
# Fin rc
: Gérard Beekmans - [email protected]
: DJ Lucas - [email protected]
: Bruce Dubbs - [email protected]
: Gérard Beekmans - [email protected]
: DJ Lucas - [email protected]
: Bruce Dubbs - [email protected]
: EPA 7.0
: Avec du code basé sur simpleinit-msb de Matthias Benkmann http://winterdrache.de/linux/newboot/index.html
Le fichier doit être situé dans /lib/lsb
: EPA 7.0
: Avec du code basé sur simpleinit-msb de Matthias Benkmann http://winterdrache.de/linux/newboot/index.html
Le fichier doit être situé dans /lib/lsb