#
# rc This file is responsible for starting/stopping # 该脚本主要是用于在切换运行级别时启动/停止服务
# services when the runlevel changes.
#
# Original Author:
# Miquel van Smoorenburg, <[email]miquels@drinkel.nl.mugnet.org[/email]>
#
{
# Check if the file exists at all. # -x 可以测试该 symbol link ($1)的 target 是否可执行,如果不是则返回1
[ -x "$1" ] || return 1
case "$1" in # 根据 $1 的值进行选择
*.rpmsave|*.rpmorig|*.rpmnew|*~|*.orig) # 如果是以 .rpmsave ,。rpmorig、.rpmnew ,~ ,.orig 结尾的,则
return 1 # 返回 1
;;
esac
return 0 # 如果 target 存在且可执行,又不是备份文件,则返回 0
}
argv1="$1" # 把目标新运行级别 $1 赋予给 argv1 变量
set `/sbin/runlevel` # 运行 runlevel 命令,把值送给 set 命令,set 默认会把 N 赋予 $1 ,3 赋予 $2
runlevel=$2 # 把 $2 送给 runlevel 变量
previous=$1 # 把 $1 送给 previous 变量
export runlevel previous # 导出这两个变量
if [ "$previous" = "N" ]; then # 如果前一个运行级别是 N ,表示没有改变过运行级别
if [ -f /var/run/confirm ]; then # 如果存在 /var/run/confirm 文件(由 rc.sysinit 创建,前提是 $cmdline 有 confirm
echo $"Entering interactive startup" # 则打印 "Enterinig interactive setup" 提示信息
else # 如果不存在 /var/run/confirm 文件,则
echo $"Entering non-interactive startup" # 打印 "Entering non-interactive startup" 表示用户在下来的过程中无法干涉
fi
fi
[ -d /etc/rc$runlevel.d ] || exit 0 # 如果存在这个目录就继续,否则返回 0
for i in /etc/rc$runlevel.d/K* ; do # 对于在 /etc/rc<new-level>.d/ 目录下的每个以 K 开头的文件
check_runlevel "$i" || continue # 首先用 check_runlevel 检查符号连接的有效性
subsys=${i#/etc/rc$runlevel.d/K??} # 从符号连接名中取出真正的服务名,也就是K<0-9><0-9> 后面的部分
[ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] \ # 如果在 /var/lock/subsys 中有同样名称的文件或者 <prog>.init 文件,
|| continue # 则执行后面的脚本,如果没有则表示服务停止,无须执行下面的代码
if egrep -q "(killproc |action )" $i ; then # 如果脚本中含有 killprog 或者 action
$i stop # 直接用 <prog> stop 的方式停止它们
else # 如果找不到这两个字符串,则
action $"Stopping $subsys: " $i stop # 用 action 函数,打印 "Stopping <prog> :" ,然后执行 <prog> stop
fi
done # 这样先把每个以 K 开头的脚本都执行完
for i in /etc/rc$runlevel.d/S* ; do # 首先对于 /etc/rc<new-level>.d/ 目录下的 S 开头的每个文件,都执行下面的代码
check_runlevel "$i" || continue # check_runlevel 确保存在 target ,否则跳过该服务
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 # 启动服务可以是 confirm 模式,也就是按y启动、按n不启动,按c恢复到非交互模式
if [ -f /var/run/confirm ]; then # 首先查询是否有 /var/run/confirm 文件存在。
confirm $subsys # 如果存在,就使用 /etc/init.d/functions 的 confirm 函数来处理该服务
test $? = 1 && continue # 按y返回0,按n返回1,按c返回2;如果是1的话表示不启动该服务,所以跳过后面代码
fi
# Bring the subsystem up. # 现在可以激活该服务了。注意,上面 confirm $subsys 只是确认是否启动而已,并为真正启动
if [ "$subsys" = "halt" -o "$subsys" = "reboot" ]; then # 如果该服务 $sbusys 是 halt 或者 reboot 服务,则
export LC_ALL=C # 把 LC_ALL 设置为 C
exec $i start # 执行 exec $i start ,也就是用 halt start 或者 reboot start 代替当前进程,注意 exec 的使用
fi
if egrep -q "(daemon |action |success |failure )" $i 2>/dev/null \ # 如果不是上面两个服务之一,且该服务脚本中有 daemon、action、success、failure 等字符串,则
|| [ "$subsys" = "single" -o "$subsys" = "local" ]; then # 或者服务为 single 或者 local 服务,则
$i start # 直接执行 <prog> start ,这次不用 exec 方式了
else # 如果都不是上面的 halt、reboot、single、local 服务,则
action $"Starting $subsys: " $i start # 用 action 打印一个 "starting xxx" 的信息,然后执行 $i start 启动该服务
fi
done # 就用这样的方式对每个 S 开头的脚本都处理一次
###########################################################################################################################################################
/usr/bin/rhgb-client --quit # 执行 rhgb-client --quit ,--quit 就是告诉 rhgb 服务器(/usr/sbin/rhgb)退出
fi