home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2007 January, February, March & April
/
Chip-Cover-CD-2007-02.iso
/
boot
/
i386
/
rescue
/
etc
/
init.d
/
rc
< prev
next >
Wrap
Text File
|
2006-11-29
|
10KB
|
399 lines
#! /bin/bash
#
# Copyright (c) 1996-2004 SuSE Linux AG, Nuernberg, Germany.
# All rights reserved.
#
# Author: Florian La Roche, 1996
# Werner Fink <werner@suse.de> 1994-99,2000-2004
#
# Please send feedback to http://www.suse.de/feedback
#
# /etc/init.d/rc -- The Master Resource Control Script
#
# This file is responsible for starting/stopping services
# when the runlevel changes. If the action for a particular
# feature in the new run-level is the same as the action in
# the previous run-level, this script will neither start nor
# stop that feature.
#
#
# Avoid be interrupted by child or keyboard
#
trap "echo" SIGINT SIGSEGV SIGQUIT
trap 'test "$RUNLEVEL" = "1" && exit 0' SIGTERM
set +e
#
# On previous runlevel identical with current runlevel do not
# re-examine current runlevel.
#
test "$PREVLEVEL" = "$RUNLEVEL" && exit 0
#
# Coming from runlevel 1 we do not need to enter S
#
test "$PREVLEVEL" = "1" -a "$RUNLEVEL" = "S" && exit 0
#
# Up from runlevel N we may want to run in confirm mode
#
if test "$PREVLEVEL" = "N" ; then
test -e /proc/cmdline || mount -n -t proc proc /proc
read -t 2 check < /proc/cmdline 2> /dev/null
case "$check" in
*confirm*) DO_CONFIRM=yes ;;
esac
test -e /var/run/do_confirm && DO_CONFIRM=yes
rm -f /var/run/do_confirm
export DO_CONFIRM
fi
runrc=/etc/init.d/rc${RUNLEVEL}.d
prerc=/etc/init.d/rc${PREVLEVEL}.d
#
# Initialize boosplash progressbar variables
#
. /etc/rc.splash $RUNLEVEL
#
# Up from runlevel S we have to check if the system was
# cold booted into single user mode and call /etc/init.d/boot.
#
if test "$PREVLEVEL" = "S" -a "$RUNLEVEL" != "0" -a "$RUNLEVEL" != "6" ; then
# Double check
single="no"
hvname="yes"
#
check=""
test -e /proc/cmdline || mount -n -t proc proc /proc
read -t 2 check < /proc/cmdline 2> /dev/null
case " ${check} " in
*\ single\ *|*\ s\ *)
single="yes"
esac
read -t 2 check < /proc/sys/kernel/hostname 2> /dev/null
case "${check}" in
"(none)"|unknown|"")
hvname="no"
esac
unset check
if test "$single" = "yes" -a "$hvname" = "no" ; then
# This is the case if we're up from cold boot
echo "Sending all processes the TERM signal..."
killall5 -15
sleep 3
echo "Sending all processes the KILL signal..."
killall5 -9
cat /proc/mounts | while read des fs type rest; do
case "$type" in
swap) continue ;;
proc) continue ;;
nfs|nfs4) continue ;;
smbfs|cifs) continue ;;
esac
umount -n -r $fs
done
cat /proc/swaps | while read des rest ; do
test "$des" = "Filename" && continue
swapoff $des &> /dev/null
done
umount -n -t proc /proc
/etc/init.d/boot
else
for b in /etc/init.d/boot.d/S*boot.udev
do
test -x $b || continue
$b start
done
fi
fi
#
# Get terminal size of standard input of the system console
#
test -z "$CONSOLE" && CONSOLE=/dev/console
set -- $(stty size < $CONSOLE)
LINES=$1
COLUMNS=$2
export LINES COLUMNS CONSOLE
#
# Set I/O of this script and its childs to console
#
exec 0<> $CONSOLE 1>&0 2>&0
#
# Dummy shell function
#
chvt () { true; }
#
# This redirects all rc messages during reboot and halt
# to tty1 if the system console is bound on VGA (tty0).
#
REDIRECT="`showconsole 2>/dev/null`"
export REDIRECT
if test -x /sbin/isserial && /sbin/isserial ; then
# Serial: columns and lines are not defined
: ${LINES:=24}
: ${COLUMNS:=80}
test "$TERM" = "linux" -o -z "$TERM" && TERM=vt102
else
# VGA
if test "$RUNLEVEL" = "0" -o "$RUNLEVEL" = "6" ; then
case "$REDIRECT" in /dev/tty[1-9]*)
REDIRECT=/dev/tty1
setconsole $REDIRECT < $CONSOLE
# Overwrite chvt shell function
chvt () { test -x /usr/bin/chvt && /usr/bin/chvt 1 ; }
set -- $(stty size < $REDIRECT)
LINES=$1
COLUMNS=$2
export LINES COLUMNS
esac
fi
fi
#
# May change to first terminal, but first we kill all vlock sessions
#
killall -q /usr/bin/vlock &> /dev/null || true
chvt
#
# Configuration and coloring of the boot messages
#
. /etc/rc.status
. /etc/sysconfig/boot
#
# Save old terminal settings and set -nl to avoid staircase
# effect, do not lock scrolling, and avoid break characters.
#
otty=$(stty -g)
if test "$FLOW_CONTROL" = "yes" ; then
stty -nl ixon ignbrk -brkint
else
stty -nl -ixon ignbrk -brkint
fi
#
# Start blogd if not in single user mode
#
if test "$RUNLEVEL" != "S" -a -x /sbin/blogd -a -n "$REDIRECT" ; then
/sbin/blogd $REDIRECT
fi
if test -z "$REDIRECT" ; then
if (echo -n > /dev/tty) 2>/dev/null ; then
REDIRECT=/dev/tty
else
REDIRECT=/dev/console
fi
fi
if test "$DO_CONFIRM" = "yes" ; then
echo -n "Master Resource Control: "
echo -e "${stat}${extd}Interactive startup${norm}"
fi
echo -n "Master Resource Control: "
echo -n "previous runlevel: $PREVLEVEL, "
echo -e "switching to runlevel: ${stat}${extd}${RUNLEVEL}${norm}"
splashtrigger "rlchange $RUNLEVEL"
#
# Start the user defined resource control script which
# should be executed _before_ runlevel is entered.
#
if test -f /etc/init.d/before.local ; then
echo -n "Master Resource Control: "
echo "Running /etc/init.d/before.local"
/bin/sh /etc/init.d/before.local
rc_status -v1 -r
splashtrigger "before.local"
fi
rex="[0-9][0-9]"
failed=""
skipped=""
callord=""
#
# Check if we are able to use make like booting
#
test -s /etc/init.d/.depend.start || RUN_PARALLEL="no"
test -s /etc/init.d/.depend.stop || RUN_PARALLEL="no"
test "$DO_CONFIRM" = "yes" && RUN_PARALLEL="no"
type -p startpar &> /dev/null || RUN_PARALLEL="no"
startpar -v &> /dev/null || RUN_PARALLEL="no"
#
# Stop/Start services to enter new runlevel
#
if test "$RUN_PARALLEL" = "yes" ; then
#
# Stop/Start services in parallel with make behaviour of startpar
#
startopt="-p4 -t 30 -T 3 $(splashmake)"
eval $(startpar $startopt -M stop -P $PREVLEVEL -R $RUNLEVEL)
failed="${failed:+$failed }$failed_service"
skipped="${skipped:+$skipped }$skipped_service"
eval $(startpar $startopt -M start -P $PREVLEVEL -R $RUNLEVEL)
failed="${failed:+$failed }$failed_service"
skipped="${skipped:+$skipped }$skipped_service"
unset failed_service skipped_service startopt
else
#
# First check and test services of previous and current (new) runlevel.
#
for i in $prerc/K${rex}*; do
test -x "$i" || continue
#
# Don't stop service if the new runlevel requires the service.
#
K=${i##*/}
service=${K#*K$rex}
K=${K%$service}
set -- $runrc/S$rex$service
test $# -gt 1 && echo -e "$attn$runrc/: more than one link for service $service$norm"
test -x "$1" && continue
blogger "$service stop"
$i stop; status=$?
echo -en "$rc_reset"
splashprogress "$service stop"
case $status in
[1-4]) failed="${failed:+$failed }$service" ;;
[56]) skipped="${skipped:+$skipped }$service" ;;
[07]|*) ;;
esac
blogger "'$service stop' exits with status $status"
done
for i in $runrc/S${rex}*; do
test -x "$i" || continue
#
# Don't start service if previous runlevel includes the service.
#
S=${i##*/}
service=${S#*S$rex}
S=${S%$service}
set -- $prerc/K$rex$service
test $# -gt 1 && echo -e "$attn$prerc/: more than one link for service $service$norm"
test -x "$1" && continue
#
# Ask the user if wanted
#
if test "$DO_CONFIRM" = "yes" ; then
rc_confirm -t $CONFIRM_PROMPT_TIMEOUT "Start service $service"
case "$?" in
0) true ;;
1) continue ;;
2) DO_CONFIRM=""
esac
fi
blogger "$service start"
$i start; status=$?
echo -en "$rc_reset"
splashprogress "$service start"
case "$status" in
[1-47]) failed="${failed:+$failed }$service" ;;
[56]) skipped="${skipped:+$skipped }$service" ;;
0|*) ;;
esac
blogger "'$service start' exits with status $status"
done
fi
#
# Inform the users
# Reaction on LSB return values:
# OK : 0 - success
# FAIL : 1 - generic or unspecified error
# FAIL : 2 - invalid or excess argument(s)
# FAIL : 3 - unimplemented feature (e.g. "reload")
# FAIL : 4 - insufficient privilege
# SKIP : 5 - program is not installed
# SKIP : 6 - program is not configured
# FAIL : 7 - program is not running (doing "start")
# OK : 7 - program is not running (doing "stop")
#
#
# Start the user defined resource control script which
# should be executed _after_ runlevel is reached.
#
if test -f /etc/init.d/after.local ; then
echo -n "Master Resource Control: "
echo "Running /etc/init.d/after.local"
/bin/sh /etc/init.d/after.local
rc_status -v1 -r
splashtrigger "after.local"
fi
splashtrigger "rlreached $RUNLEVEL"
#
# Be verbose and print stats
#
echo -n "Master Resource Control: "
echo -e "runlevel ${RUNLEVEL} has been ${stat}${extd}reached${norm}"
if test -n "$failed" ; then
n=$((${#failed} + 7))
echo -n "Failed services in runlevel ${RUNLEVEL}: "
test $n -lt 47 && echo -en "\033[${COLUMNS}C\033[${n}D"
echo -e "${warn}${failed}${norm}"
fi
if test -n "$skipped" ; then
n=$((${#skipped} + 7))
echo -n "Skipped services in runlevel ${RUNLEVEL}: "
test $n -lt 47 && echo -en "\033[${COLUMNS}C\033[${n}D"
echo -e "${attn}${skipped}${norm}"
fi
#
# Check for boot cycle detection
#
test -s /lib/bootcycle/stats && . /lib/bootcycle/stats
#
# Stop blogd if running
#
test -x /sbin/blogd && killproc -QUIT /sbin/blogd
#
# Restore old terminal settings
#
stty $otty
#
# For the first logon on a virtual console.
#
test -e /etc/issue-SuSE-first-run && {
cat /etc/issue-SuSE-first-run > $REDIRECT
rm -f /etc/issue-SuSE-first-run 2>/dev/null
}
exit 0