#! /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文件存在,[size=18][color=red]或[/color][/size]在/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、[ -选项 条件(或语句)] 的语法中,在[]中一定要有空格