|
发表于 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参数!
- ...
- # 这里用变量argv1保存了init程序传递给rc脚本的位置参数$1="3"
- argv1="$1"
- ...
- # Get first argument. Set new runlevel to this argument.
- #这里把新的runlevel赋值为rc脚本的原$1="3"参数
- [ -n "$argv1" ] && runlevel="$argv1"
- ...
- check_runlevel ()
- {
- # Check if the file exists at all.
- [ -x "$1" ] || return 1
- ...
- # First, run the KILL scripts.
- for i in /etc/rc$runlevel.d/K* ; do
- check_runlevel "$i" || continue
- ...
- # Now run the START scripts.
- for i in /etc/rc$runlevel.d/S* ; do
- check_runlevel "$i" || continue
- # 显然,check_runlevel函数中的$1是rc.$runlevel.d里面的脚本软链接,而不是rc脚本的参数"3"
复制代码
总而言之,要区分函数与脚本本身的位置参数。
其实很多问题可以归咎于对基础知识的疏忽,建议大家常温习基础。 |
|