![运行级别脚本的执行顺序](https://linux22.com/image/637037/%E8%BF%90%E8%A1%8C%E7%BA%A7%E5%88%AB%E8%84%9A%E6%9C%AC%E7%9A%84%E6%89%A7%E8%A1%8C%E9%A1%BA%E5%BA%8F.png)
我的运行级别 0 脚本位于 /etc/rc0.d 中,应在停止时执行,例如
- K05foo-> ...
- K10巴-> ...
- K80baz-> ...
- S10更多-> ...
- S90停止-> ...
执行顺序是否如上所列,即
- 首先按优先级升序排列所有击杀
- 然后所有启动,按优先级升序排列
- 所有这些,与我们切换到的运行级别无关(S,0-6)
- 所有脚本总是会被调用(即,没有额外的检查来阻止脚本被调用,例如,该脚本是否在之前的运行级别中实际启动)
我很困惑,因为在我的嵌入式系统上有些脚本似乎没有被执行,而且该页面说
S20 链接在 S91 之前启动,且 K91 在 K20 之前终止。
这与我上面的文字相矛盾。
答案1
为了完整起见,回答我自己的问题:
我在 OpenEmbedded 系统上使用 busybox。 rc 脚本/etc/init.d/rc
具有以下行为:
- 在目标运行级别中,所有 Kill 都在所有 Start 之前执行
- 所有脚本按优先级升序执行
- 但是:仅当在前一个运行级别中没有等效启动时才会执行启动(即,它是新启动的)
- 并且,如果目标运行级别为 0(停止)或 6(重新启动),则启动实际上是作为 Kills 执行的 - 即“stop”作为参数传递。但仍然在所有 Kills 之后,并且如果在之前的运行级别中存在等效启动,则仍然不会。
此外,让我感到困扰的是,这shutdown now
实际上切换到了运行级别 1,而不是运行级别 0。您必须对运行级别 0 使用halt
或poweroff
。因此,rc0.d 中的脚本并没有真正执行,只有碰巧也在 rc1.d 中的脚本才被执行。
答案2
这取决于您使用的 init 守护进程。
对于 SysVInit,当您将运行级别更改为 0 时,您可以假设发生以下情况:
rl=0
for k in /etc/rc$rl.d/K*; do
$k stop
done
for s in /etc/rc$rl.d/S*; do
$s start
done
我看不出您引用的句子与您上面所说的内容有任何矛盾。