Библиотека сайта 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 | Оглавление |
