linux-2yyi:/etc/rc.d # cat rc #! /bin/bash # # Copyright (c) 1996-2004 SuSE Linux AG, Nuernberg, Germany. # All rights reserved. # # Author: Florian La Roche, 1996 # Werner Fink 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