Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

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