Библиотека сайта rus-linux.net
Исследуем процесс загрузки Linux
(C) В.А.Костромин, 2007
(версия файла от 18.09.2007 г.)
Вернуться к разделу 7 | Оглавление |
Приложение 3. Пример скрипта /etc/rc.d/rc
В листинге 13 приведено содержимое файла /etc/rc.d/rc с компьютера, на котором установлен дистрибутив Mandriva Free 2007 Spring.
Листинг 13. Файл /etc/rc.d/rc системы Mandriva Free 2007 Spring.ё
#! /bin/bash # # rc This file is responsible for starting/stopping # services when the runlevel changes. # # Original Author: # Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org> # set -m # Задается функция, которая проверяет, что заданный в качестве первого # параметра файл является правильным скриптом (to be a correct runlevel script) check_runlevel () { # Проверяем, существует ли такой файл. [ -x "$1" ] || return 1 is_ignored_file "$1" && return 1 a=$[service++] return 0 } # Находим и запоминаем текущий уровень выполнения и предыдущий уровень выполнения. # Вначале запоминаем в argv1 первый аргумент вызова скрипта argv1="$1" # Команда /sbin/runlevel выдает два символа - предыдущий и текщий уровни # выполнения (если предыдущего уровня не было, то первый символ равен N). # set `/sbin/runlevel` runlevel=$2 previous=$1 export runlevel previous # Задаем уровень выполнения, на который требуется перейти. # Если при вызове скрипта параметр задан, то newrunlevel равен этому параметру, # а иначе он будет задан равен текущему уровню выполнения. if [ "$argv1" != "" ] ; then newrunlevel="$argv1" else newrunlevel="$runlevel" fi if [ "$previous" = "N" ];then if [ -e /var/run/failsafe ];then rm -f /var/run/failsafe if [ -x /sbin/askrunlevel ];then /sbin/askrunlevel --interactive && ASKRUNLEVEL=no else init 1 #jump to init 1 if not aksrunlevel. fi fi fi . /etc/init.d/functions initsplash # See if we want to be in user confirmation mode if [ "$previous" = "N" ]; then rc_splash start if [ -f /var/run/confirm ]; then gprintf "Entering interactive startup\n" else gprintf "Entering non-interactive startup\n" fi elif [[ "$newrunlevel" = "0" || "$newrunlevel" = "6" ]]; then chvt 1 exec &> /dev/console # Make sure terminal is switched to correct charset. # It has to be after chvt of course. For startup case it really # does not matter as tty is not changed between rc.sysinit and rc # DO NOT REMOVE THIS. Please :) /sbin/setsysfont fi # Tell linuxconf what runlevel we are in [ -d /var/run ] && echo "/etc/rc$runlevel.d" > /var/run/runlevel.dir # Get first argument. Set new runlevel to this argument. [ -n "$argv1" ] && runlevel="$argv1" # Is there an rc directory for this new runlevel? [ -d /etc/rc$runlevel.d ] || exit 0 nopinit=`grep nopinit /proc/cmdline` # Вначале выполняем все KILL-скрипты. if [ -z "$nopinit" ]; then /sbin/prcsys K /etc/rc$runlevel.d/ progress=$? else for i in /etc/rc$runlevel.d/K* ; do check_runlevel "$i" || continue # Check if the subsystem is already up. subsys=${i#/etc/rc$runlevel.d/K??} rc_splash $subsys [ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] \ || continue # Bring the subsystem down. if LC_ALL=C egrep -q "^..*init.d/functions" $i ; then $i stop else action "Stopping %s: " $subsys $i stop fi done fi if [ -z "$nopinit" ] && [ ! -f /var/run/confirm -a "$runlevel" != "0" -a "$runlevel" != "1" -a "$runlevel" != "6" ]; then /sbin/prcsys S /etc/rc$runlevel.d/ else # Теперь запускаем все START-скрипты. for i in /etc/rc$runlevel.d/S* ; do check_runlevel "$i" || continue # Check if the subsystem is already up. subsys=${i#/etc/rc$runlevel.d/S??} [ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] \ && continue # If we're in confirmation mode, get user confirmation if [ -f /var/run/confirm ]; then if [ "$subsys" = dm ]; then CONFIRM_DM=1 continue fi confirm $subsys case $? in 1) continue;; 2) rm -f /var/run/confirm;; esac fi rc_splash $subsys # Bring the subsystem up. if [ "$subsys" = "halt" -o "$subsys" = "reboot" ]; then export LC_ALL=C exec $i start fi if [ "$subsys" = "single" ]; then rc_splash stop fi if LC_ALL=C egrep -q "^..*init.d/functions" $i \ || [ "$subsys" = "single" -o "$subsys" = "local" ]; then $i start else action "Starting %s: " $subsys $i start fi done # start dm service at the end in confirmation mode if [ "$CONFIRM_DM" = 1 ]; then if [ -f /var/run/confirm ]; then confirm dm case $? in 1) :;; *) rc_splash dm; /etc/init.d/dm start;; esac else rc_splash dm /etc/init.d/dm start fi fi fi if [[ "$newrunlevel" != "0" && "$newrunlevel" != "6" ]]; then rc_splash stop fi rm -f /var/run/confirm |
Вернуться к разделу 7 | Оглавление |