在 /etc/rc?.d/ 中运行的脚本的执行顺序
==================================
0. 概述
所有由初始化系统执行的脚本都存放于 /etc/init.d/ 。/etc/rc?.d (? = S, 0 .. 6)目录包含了那些脚本的相关的静态链接。这些链接以 S<2位数字><原文件名> 或者 K<2位数字><原文件名> 命名。
如果脚本带有“.sh”后缀,那么它是一个 bourne shell 脚本,并且有可能以一种优化的方式被调用。以优化方式执行脚本的行为不会与以正常方式调用执行脚本的结果有任何不同。
如下定义了各种运行级别:
N 系统引导(NONE)
S 单用户模式(不会直接切换到)
0 系统终止
1 单用户模式
2 .. 5 多用户模式
6 重新启动
1. 引导。
在系统引导的时候,/etc/init.d/rcS 脚本被执行。它按字母和数字顺序依次执行 /etc/rcS.d/ 内的所有 S* 脚本。传递给被执行脚本的第一个参数是“start”。运行级别在这个时刻是“N”(none)。
只有那些需要使系统进入一个坚固状态的程式会被运行。rcS.d 目录并不意味着替代 rc.local 的需要。例如 NFS 可能需要 portmapper(端口映射程式),因此它可以在引导过程的稍早时候启动。但这时并不是 squid 代理服务器启动的时候。
2. 进入多用户。
在 rcS.d 脚本被执行以后,初始化进程切换到 /etc/inittab 中指定的缺省的运行级别,通常是“2”。
然后初始化进程执行 /etc/init.d/rc 脚本以关照在 /etc/rc2.d 中启动的服务。
因为之前的运行级别是“N”(none),所以 /etc/rc2.d/KXXxxxx 脚本将不被执行 —— 因为现在没有东西会停止,系统正忙于启动。
如果假设有一个服务希望运行于运行级别 4 并且希望仅仅运行于那个级别,它会把一个 KXXXxxxx 脚本放在 /etc/rc{2,3,5}.d 中,以使得在切换到运行级别 4 之外的时候停止这个服务。我们不需要在此刻运行那个脚本。
/etc.rc2.d/SXXxxxx 脚本将按照字母顺序被执行,以“start”作为第一个参数。
3. 切换运行级别。
当一个用户从(例如)运行级别 2 切换到运行级别 3 的时候,/etc/init.d/rc 会首先按字母顺序、以“stop”为第一个参数执行运行级别 3 的所有 K 脚本(/etc/rc3.d/KXXxxxx),然后以“start”为第一个参数执行运行级别 3 的所有 S 脚本(/etc/rc3.d/SXXxxxx)。
作为一种调整策略,每个服务都会被检查是否已经运行于前一个运行级别。如果是,并且它没有 K(停止)脚本存在于新的运行级别,则没有必要第二次启动它。
另一方面,如果有一个 K 脚本存在,则假定这个服务已经有目的地停止,并且没有必要重新启动。
我们也有可能对停止脚本使用相同的调整策略 —— 如果没有 S 脚本存在于前一个运行级别,我们可以假定这个服务没有运行,并且我们也没有必要停止它。在这种情况下我们可以排除掉在 2)中提及到的“来自运行级别 N”的特殊的情况。但目前那种情况并未出现。
4. 单用户模式。
切换到单用户模式是由切换到运行级别 1 完成的。这会引致所有服务被停止(假定它们都有一个 K 脚本在 /etc/rc1.d 中)。然后运行级别 1 的脚本会切换到没有脚本的运行级别“S” —— 所有它所做的就是保持直接在 /dev/console 中产生一个 shell。
5. 系统终止 / 重新启动
进入运行级别 0 或者 6 会分别引致系统终止或者重新启动。例如,如果我们进入运行级别 6(重新启动),首先所有 /etc/rc6.d/KXXxxxx 脚本都会按照字母顺序、以“stop”为第一个参数执行。
然后 /etc/rc6.d/SXXxxxx 脚本也会按照字母顺序、以“stop”作为第一个参数执行。理由是再没有任何程式需要在这个时刻启动了 —— 运行的所有脚本都是为了使系统停止下来。
在将来,为了更清晰,/etc/rc6.d/SXXxxxx 脚本有可能被移到(更名为) /etc/rc6.d/K1XXxxxx。
翻译:懒猫,于广州,2005年11月7日。 |