#! /bin/sh # # rc This file is responsible for starting/stopping # services when the runlevel changes. # # Optimization feature: # A startup script is _not_ run when the service was # running in the previous runlevel and it wasn't stopped # in the runlevel transition (most Debian services don't # have K?? links in rc{1,2,3,4,5} ) # # Author: Miquel van Smoorenburg # Bruce Perens # # Version: @(#)rc 2.78 07-Nov-1999 miquels@cistron.nl # # James F. Carter DISCLAIMS ALL WARRANTY for hacks in this script. # Un-comment the following for debugging. # debug=echo logfile=/var/log/rc.log fat=`find ${logfile%/*} -name ${logfile##*/} -size +63 -print` if [ -n "$fat" ] ; then mv $logfile $logfile.0 for n in 4 3 2 1 0 ; do if [ -e $logfile.$n ] ; then mv $logfile.$n $logfile.$((n+1)) ; fi done fi echo "===========================" >> $logfile # # Start script or program. Args: name of script, {start or stop}. # startup() { echo "== Doing $*" >> $logfile case "$1" in *.sh) $debug sh "$@" >> $logfile 2>&1 ;; *) $debug "$@" >> $logfile 2>&1 ;; esac sync } # Ignore CTRL-C only in this shell, so we can interrupt subprocesses. trap ":" INT QUIT TSTP # Set onlcr to avoid staircase effect. #stty onlcr 0>&1 [ -x /etc/ptmalloc.conf ] && . /etc/ptmalloc.conf # Now find out what the current and what the previous runlevel are. runlevel=$RUNLEVEL # Get first argument. Set new runlevel to this argument. [ "$1" != "" ] && runlevel=$1 if [ "$runlevel" = "" ] then echo "Usage: $0 " >&2 exit 1 fi previous=$PREVLEVEL [ "$previous" = "" ] && previous=N export runlevel previous echo -n "rc from runlevel $previous -> $runlevel at " >> $logfile date >> $logfile # Is there an rc directory for this new runlevel? if [ -d /etc/rc$runlevel.d ] then # First, run the KILL scripts. if [ $previous != N ] then for i in /etc/rc$runlevel.d/K[0-9][0-9]* do # Check if the script is there. [ ! -f $i ] && continue # Stop the service. startup $i stop done fi # Now run the START scripts for this runlevel. for i in /etc/rc$runlevel.d/S* do [ ! -f $i ] && continue if [ $previous != N ] && [ $previous != S ] then # # Find start script in previous runlevel and # stop script in this runlevel. # suffix=${i#/etc/rc$runlevel.d/S[0-9][0-9]} stop=/etc/rc$runlevel.d/K[0-9][0-9]$suffix previous_start=/etc/rc$previous.d/S[0-9][0-9]$suffix # # If there is a start script in the previous level # and _no_ stop script in this level, we don't # have to re-start the service. # [ -f $previous_start ] && [ ! -f $stop ] && continue fi case "$runlevel" in 0|6) startup $i stop ;; *) startup $i start ;; esac done fi # eof /etc/init.d/rc