运行级别脚本的执行顺序

运行级别脚本的执行顺序

我的运行级别 0 脚本位于 /etc/rc0.d 中,应在停止时执行,例如

  1. K05foo-> ...
  2. K10巴-> ...
  3. K80baz-> ...
  4. S10更多-> ...
  5. S90停止-> ...

执行顺序是否如上所列,即

  1. 首先按优先级升序排列所有击杀
  2. 然后所有启动,按优先级升序排列
  3. 所有这些,与我们切换到的运行级别无关(S,0-6)
  4. 所有脚本总是会被调用(即,没有额外的检查来阻止脚本被调用,例如,该脚本是否在之前的运行级别中实际启动)

我很困惑,因为在我的嵌入式系统上有些脚本似乎没有被执行,而且该页面

S20 链接在 S91 之前启动,且 K91 在 K20 之前终止。

这与我上面的文字相矛盾。

答案1

为了完整起见,回答我自己的问题:

我在 OpenEmbedded 系统上使用 busybox。 rc 脚本/etc/init.d/rc具有以下行为:

  • 在目标运行级别中,所有 Kill 都在所有 Start 之前执行
  • 所有脚本按优先级升序执行
  • 但是:仅当在前一个运行级别中没有等效启动时才会执行启动(即,它是新启动的)
  • 并且,如果目标运行级别为 0(停止)或 6(重新启动),则启动实际上是作为 Kills 执行的 - 即“stop”作为参数传递。但仍然在所有 Kills 之后,并且如果在之前的运行级别中存在等效启动,则仍然不会。

此外,让我感到困扰的是,这shutdown now实际上切换到了运行级别 1,而不是运行级别 0。您必须对运行级别 0 使用haltpoweroff。因此,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

我看不出您引用的句子与您上面所说的内容有任何矛盾。

相关内容