转载:/etc/rc.d/rc文件分析

来源:互联网 发布:snagit mac 破解版 编辑:程序博客网 时间:2024/06/11 14:29
系统运行级别切换时所执行的文件/etc/rc.d/rc文件分析
原文链接:
http://bbs.chinaunix.net/viewthread.php?tid=482654
#! /bin/bash
#此文件用于对系统的运行级别改变后,对于启动及停止服务进行响应。
# rc            This file is responsible for starting/stopping
#               services when the runlevel changes.
#
# Original Author:
#               Miquel van Smoorenburg, ;
#
# 下列的角本用于检测正确的运行级别
# check a file to be a correct runlevel script
check_runlevel ()
{
# Check if the file exists at all.(语句含义为如果前边的命令执行未成功,则返回1)检测文件是否存在
[ -x "$1" ] || return 1   #如果第一个参数不是可执行文件,那么返回1
# 拒绝备份和由rpm所产生的文件Reject backup files and files generated by rpm.
case "$1" in
*.rpmsave|*.rpmorig|*.rpmnew|*~|*.orig)  #如果第1个参数中包含下列的扩展名,则返回1,否则返回0
return 1
;;
esac
return 0
}
# Now find out what the current and what the previous runlevel are.
#现在查找当前和以前的运行级别。
argv1="$1"   #为argv1赋值,等于第一个参数
set `/sbin/runlevel`   
runlevel=$2  #目前运行级为第二个参数
previous=$1  #以前的运行级别为第1个参数
export runlevel previous   #导出这两个变量为全局的变量
. /etc/init.d/functions   #执行文件functions
# See if we want to be in user confirmation mode  
#是否我们是在用户确认的模式下。即是否进入用户干预的模式
if [ "$previous" = "N" ]; then
if [ -f /var/run/confirm ] \     #confirm文件存在
|| grep -i confirm /proc/cmdline >;/dev/null ; then  
#在/proc/cmdline中以不区分大小写的模式下查找符合confirm格式的内容
#if条件语句含义为:如果/var/run/confirm文件存在,在/proc/cmdline中有与confirm匹配的内容
rm -f /var/run/confirm   #删除文件
CONFIRM=yes #为变量赋值
export CONFIRM  #输出变量
echo $"Entering interactive startup"   #在输出终端显示“进入用户交互模式”
else
echo $"Entering non-interactive startup"  #在输出终端显示“非用户交互模式”
fi
fi
# Get first argument. Set new runlevel to this argument.
#取第1个参数,为新的运行级别赋值
[ -n "$argv1" ] && runlevel="$argv1"   #(-n参数含义为参数长度是否为0)如果第一个参数的长度不为0,建造设置runlevel等于参数1。
# Is there an rc directory for this new runlevel?
#是否为新的运行级别设置了运行用的rc目录
[ -d /etc/rc$runlevel.d ] || exit 0  #(-d含义为目录查找)如果在etc目录下没有此运行级别的目录,由退出0。
# First, run the KILL scripts.
#首先,运行kill角本,杀掉原运行级的服务
for i in /etc/rc$runlevel.d/K* ; do  #此for循环的意义为:i是否是运行级目录下的K文件
check_runlevel "$i" || continue   
#调用运行级检测函数,如果返回0,则继续查找(||含义为如果前一个命令不成功,则执行后者。
# Check if the subsystem is already up.
# 检测子系统是否已经加载
subsys=${i#/etc/rc$runlevel.d/K??}
#这句话的含义去掉变量i中所有的/etc/rc$runlevel.d/K??的部分,并将结果赋给变量subsys
#例:i=/etc/rc$runlevel.d/K05saslauthd,那么去掉/etc/rc$runlevel.d/K??部分后,subsys为saslauthd
[ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] \
|| continue
#-o选项好象是一个or选项,在另一个相同的文件中,此选项为||,上句的意义为$subsys或$subsys.init文件是否存在
#如果这两个文件都不存在,执行continue
# Bring the subsystem down.
#将子系统(也可以说是子服务)关闭
if egrep -q "(killproc |action )" $i ; then   
#-q参数含义为不在输出设备上显示,不管找到未找到匹配东西,
#即使有错也是如此,这句话的意思是利用正则表达式egrep,在文件$i中查找包含killproc或action 的句子
#如果找到,则停止此服务
$i stop
#执行文件名为$i的服务停止
else
action $"Stopping $subsys: " $i stop
fi
done
# Now run the START scripts.
#启动开发角本
for i in /etc/rc$runlevel.d/S* ; do
#查找在/etc/rc$runlevel.d/S*中文件名为i的文件,并循环
check_runlevel "$i" || continue
#检测其运行级
# Check if the subsystem is already up.
#检测其子系统是否已经运行
subsys=${i#/etc/rc$runlevel.d/S??}
#这名句的解释同其KILL中的语句。
[ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] \
&& continue
#同上      
# If we’re in confirmation mode, get user confirmation
#如果我们是在用户确认的启动格式(即interactive交互模式)
if [ -n "$CONFIRM" ]; then
#前边已经将confirm文件删除,这里是什么意思?
confirm $subsys
case $? in
0) :;;
2) CONFIRM=;;
*) continue;;
esac  
fi
#启动子服务(系统)
# Bring the subsystem up.
if [ "$subsys" = "halt" -o "$subsys" = "reboot" ]; then
#如果变量subsys等于halt或reboot,实际上这也是两个运行级,一个是0,一个是6
export LC_ALL=C
exec $i start
#文件$i启动
fi
if egrep -q "(daemon |action |success |failure )" $i 2>;/dev/null \
|| [ "$subsys" = "single" -o "$subsys" = "local" ]; then
#条件语句含义:
#如果在文件$i中找到daemon、action、success、failure或在没有找到前述几个关键字的情况下
#但$subsye=single(单用户方式)或等于local则为真
$i start
else
action $"Starting $subsys: " $i start
fi
done
上述角本重点处说明:
1、${变量名1#$变量名2}
此外的含义为从变量名1的内容中将变量名2所代表的内容除去,但有一个限制,即必须从第1位开始,且当连续使用时要用下述方法进行转义赋值:
变量3=` echo ${变量1#$变量名2} `,然后再引用变量3才能正确的进行操作
2、 grep ?q “($变量1)” $变量2
此外在()处,不能有空格,否则查询将不会有结果
3、[ -选项 条件(或语句)] 的语法中,在[]中一定要有空格
仅针对RHArray,不当处请指出。 :em1Array: