LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 783|回复: 4

需要rc脚本的详细解释[已解决]

[复制链接]
发表于 2004-4-9 11:13:13 | 显示全部楼层 |阅读模式
如题,rc脚本是在运行级别改变的时候启动或者停止服务的。
在rc脚本的开始是一个check_runlevel()函数,如下:
check_runlevel()
{
    [-x "$1"]||return 1
    ...
}

如果运行命令$init 3,那么3将是第一个参数被传入check_runlevel(),
可是有代码[-x "$1"],3显然不是一个可以执行的程序,那么这一行
代码到底有什么意义?

请指点,谢谢!
发表于 2004-4-9 11:49:10 | 显示全部楼层

回复: 需要rc脚本的详细解释

最初由 someblue 发表
如题,rc脚本是在运行级别改变的时候启动或者停止服务的。
在rc脚本的开始是一个check_runlevel()函数,如下:
check_runlevel()
{
    [-x "$1"]||return 1
    ...
}

如果运行命令$init 3,那么3将是第一个参数被传入check_runlevel(),
可是有代码[-x "$1"],3显然不是一个可以执行的程序,那么这一行
代码到底有什么意义?

请指点,谢谢!

1. 首先明确init原理(sysV风格)

不要混淆init程序以及init脚本,init程序接收参数并运行后会把控制权交给/etc/rc.d/rc,rc脚本会查找init启动脚本,流程转换工作由init程序来做,而系统的具体初始化内容由init脚本来做。

2. 这也涉及到shell脚本的基础知识,函数的变量是全局的,除了位置参数之外
init程序是个32bit Linux ELF二进制可执行文件,它根据参数如3(一般为数字1~5)读取/etc/inittab文件相关条目,并把参数3传递给rc脚本。但要注意,这里的check_runlevel函数中的$1参数并非rc脚本的$1参数!

  1. ...
  2. # 这里用变量argv1保存了init程序传递给rc脚本的位置参数$1="3"
  3. argv1="$1"
  4. ...
  5. # Get first argument. Set new runlevel to this argument.
  6. #这里把新的runlevel赋值为rc脚本的原$1="3"参数
  7. [ -n "$argv1" ] && runlevel="$argv1"
  8. ...
  9. check_runlevel ()
  10. {
  11.         # Check if the file exists at all.
  12.         [ -x "$1" ] || return 1
  13. ...
  14. # First, run the KILL scripts.
  15. for i in /etc/rc$runlevel.d/K* ; do
  16.         check_runlevel "$i" || continue
  17. ...
  18. # Now run the START scripts.
  19. for i in /etc/rc$runlevel.d/S* ; do
  20.         check_runlevel "$i" || continue
  21. # 显然,check_runlevel函数中的$1是rc.$runlevel.d里面的脚本软链接,而不是rc脚本的参数"3"
复制代码

总而言之,要区分函数与脚本本身的位置参数。

其实很多问题可以归咎于对基础知识的疏忽,建议大家常温习基础。
 楼主| 发表于 2004-4-14 20:50:57 | 显示全部楼层

check_runlevel是一个函数声明?

看了你的解释,我又想了一想,原因应该是check_runlevel()只是一个函数声明。
在rc脚本的开始,check_runlevel()只是作为一个函数的声明;而当脚本运行时,check_runlevel()并不因为在第一行就要执行(只是一个声明,并没有被调用),真正的开始应该是
argv1="$1",
这是rc脚本首先执行的语句,而后又调用check_runlevel().
这样理解好像顺多了,不知我想的对不对。
发表于 2004-4-14 21:46:58 | 显示全部楼层

回复: check_runlevel是一个函数声明?

最初由 someblue 发表
看了你的解释,我又想了一想,原因应该是check_runlevel()只是一个函数声明。
在rc脚本的开始,check_runlevel()只是作为一个函数的声明;而当脚本运行时,check_runlevel()并不因为在第一行就要执行(只是一个声明,并没有被调用),真正的开始应该是
argv1="$1",
这是rc脚本首先执行的语句,而后又调用check_runlevel().
这样理解好像顺多了,不知我想的对不对。

嗯,没错。
其实shell函数的概念和C差不多,可以对比着来理解。
 楼主| 发表于 2004-4-15 14:17:24 | 显示全部楼层

thanks

thanks
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表