文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>系统运行级别切换时文件/etc/rc.d/rc文件分析[翻译]

系统运行级别切换时文件/etc/rc.d/rc文件分析[翻译]

时间:2005-12-06  来源:山中无老虎

#! /bin/bash

#此文件用于对系统的运行级别改变后,对于启动及停止服务进行响应。

# rc            This file is responsible for starting/stopping

#               services when the runlevel changes.

#

# Original Author:

#               Miquel van Smoorenburg, <[email protected]>

#

# 下列的角本用于检测正确的运行级别

# 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、[ -选项 条件(或语句)] 的语法中,在[]中一定要有空格

相关阅读 更多 +
排行榜 更多 +
坦克冒险大师安卓版

坦克冒险大师安卓版

策略塔防 下载
枪战大乱斗2

枪战大乱斗2

飞行射击 下载
猎鸭挑战安卓版

猎鸭挑战安卓版

飞行射击 下载