#!/bin/sh ######################################################################## # Begin $rc_base/init.d/rc # # Description : Main Run Level Control Script # # Authors : Gerard Beekmans - gerard@linuxfromscratch.org # # Version : 00.00 # # Notes : # ######################################################################## ./etc/sysconfig/rc #指定rc_bash=/etc/rc.d rc_functions =${rc_bash}/init.d/functions network_devices=/etc/sysconfig/network-devices .${rc_functions} # This sets a few default terminal options. stty sane # These 3 signals will not cause our script to exit trap "" INT QUIT TSTP #trap是bash内建的命令,用来指定信号的行为,“”为忽略该信号 [ "${1}" !="" ] && runlevel=${1} #从参数中得到运行级别,在/etc/inittab中指定的 if [ "${runlevel}"="" ];then#运行级别为空则退出 echo"Usage: ${0} ">&2 exit1 fi previous=${PREVLEVEL} #前一个级别 [ "${previous}"="" ] && previous=N #没有前一级别则为n if [ ! -d ${rc_base}/rc${runlevel}.d ];then#是否有该级别的目录 boot_mesg "${rc_base}/rc${runlevel}.d does not exist."${WARNING} boot_mesg_flush exit1 fi # Attempt to stop all service started by previous runlevel, # and killed in this runlevel #结束该级别中K开头的脚本 if [ "${previous}" !="N" ];then#如果有前一个级别 for i in $(ls -v ${rc_base}/rc${runlevel}.d/K* 2>/dev/null) do check_script_status suffix=${i#$rc_base/rc$runlevel.d/K[0-9][0-9]} #脚本的名称,除去路径和K** prev_start=$rc_base/rc$previous.d/S[0-9][0-9]$suffix #前一级别 sysinit_start=$rc_base/rcsysinit.d/S[0-9][0-9]$suffix #系统初始化 if [ "${runlevel}" !="0" ] && [ "${runlevel}" !="6" ];then#不是重启和关机 if [ ! -f ${prev_start} ] && [ ! -f ${sysinit_start} ];then#如果不存在 boot_mesg -n "WARNING: ${i} can't be"${WARNING} #前一级别并没有启动该脚本 boot_mesg -n " executed because it was not" boot_mesg -n " not started in the previous" boot_mesg -n " runlevel (${previous})." boot_mesg ""${NORMAL} boot_mesg_flush continue fi fi ${i} stop #脚本执行stop error_value=${?} #返回值 if [ "${error_value}" !="0" ];then print_error_msg fi done fi #Start all functions in this runlevel #开始所有S开头的脚本 for i in $( ls -v ${rc_base}/rc${runlevel}.d/S* 2>/dev/null)#获得每个脚本 do if [ "${previous}" !="N" ];then#如果有前一个级别 suffix=${i#$rc_base/rc$runlevel.d/S[0-9][0-9]} #脚本文件名 stop=$rc_base/rc$runlevel.d/K[0-9][0-9]$suffix prev_start=$rc_base/rc$previous.d/S[0-9][0-9]$suffix [ -f ${prev_start} ] && [ ! -f ${stop} ] && continue #如果前一个级别中没有该脚本的stop,则说明该进程已经存在 fi check_script_status #检查脚本是否存在 case ${runlevel} in #0或6则直接stop 0|6) ${i} stop ;; *) ${i} start ;; esac error_value=${?} if [ "${error_value}" !="0" ];then print_error_msg fi done #End$rc_base/init.d/rc