Рейтинг@Mail.ru
[Войти] [Зарегистрироваться]

Наши друзья и партнеры

UnixForum
Альтернативная энергия

Беспроводные выключатели nooLite

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

Библиотека сайта или "Мой Linux Documentation Project"

Исследуем процесс загрузки 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 Оглавление


Эта статья еще не оценивалась
Вы сможете оценить статью и оставить комментарий, если войдете или зарегистрируетесь.
Только зарегистрированные пользователи могут оценивать и комментировать статьи.

Комментарии отсутствуют