rc 作业如何工作/“开始于......”和“停止于......”节的顺序(矛盾)

rc 作业如何工作/“开始于......”和“停止于......”节的顺序(矛盾)

我只是不明白 Natty 11.04 中 Upstart 的 rc 作业定义是如何工作的。为了说明问题,下面是定义(省略了空行和注释):

start on runlevel [0123456]
stop on runlevel [!$RUNLEVEL]
export RUNLEVEL
export PREVLEVEL
console output
env INIT_VERBOSE
task
exec /etc/init.d/rc $RUNLEVEL

假设我们当前处于运行级别 2,并且 rc 作业已停止(这正是启动我的机器并通过 SSH 登录后的情况)。现在,假设系统切换到运行级别 3,例如由于 root 给出的“telinit 3”之类的命令。rc 作业会发生什么?

显然,rc 作业将启动,因为它当前已停止,并且事件运行级别 3 与启动事件匹配。但从现在开始,我不清楚事情:根据手册,$RUNLEVEL 在作业启动时评估新的运行级别(在我们的示例中为 3)。

因此,下一节“在运行级别 [!$RUNLEVEL] 上停止”翻译为“在运行级别 [!3] 上停止”;这意味着我们有第一节将触发该作业,但第二节永远不会停止该作业并且似乎毫无用处。

因为我知道 Ubuntu / Upstart 的人不会做无用的事情,所以我一定是严重误解了某些事情。如能得到任何解释,我将不胜感激。

在尝试理解这一点时,我想到了一个额外的问题。例如,如果我有相互矛盾的开始和停止触发器,

start on foo
stop on foo

会发生什么?我发誓我永远不会这样做,但我仍然非常感兴趣 Upstart 在理论层面上如何处理这个问题。

非常感谢!


编辑该问题作为对 geekosaur 第一个回答的回应:

我可以看到平行关系,但是它并不那么容易(至少对我来说不是)。

假设作业当前仍在运行,并且有新的运行级别事件发生(当然,新的运行级别与当前运行级别不同)。然后,应该发生以下情况:

1) 该作业是单实例。这意味着“start on ...”不会被触发,因为该作业当前正在运行;$RUNLEVEL 未受影响。

2)“停止于...”将被触发,因为新的运行级别与 $RUNLEVEL 不同,因此该作业将被中止。

3) 现在,作业已停止并正在等待。我看不出它是如何重新启动的新的运行级别。据我所知,initctl 仅发出一次事件,因此不会触发“start on ...”,也不会进入新的运行级别。

我知道我仍然误解了一些事情,并且很感谢你们的解释。

非常感谢!

答案1

在处理事件时,upstart 会非常小心地维护操作顺序。由事件引起的停止总是在启动之前完成。虽然 Linux 是多进程的,但 upstart 的事件引擎不是。

因此,发出“runlevel”事件的运行级别命令由 upstart 状态引擎接收,然后通过首先完成从启动到停止的所有转换来处理。这将堵塞直到第一个 rc 被杀死并死亡。然后从停止到启动的转换完成,并启动新的 rc 作业。

这实际上在 upstart 源代码中有记录:

    /* We stop first so that if an event is listed both as a
     * stop and start event, it causes an active running process
     * to be killed, the stop script then the start script to be
     * run.  In any other state, it has no special effect.
     *
     * (The other way around would be just strange, it'd cause
     * a process's start and stop scripts to be run without the
     * actual process).
     */

这可能属于新贵食谱,所以我在这里针对它打开了一个愿望清单错误:

https://bugs.launchpad.net/upstart-cookbook/+bug/745096

答案2

现在,我们已经在 Upstart Cookbook 中清楚地记录了“rc”作业在 Ubuntu 中的工作方式(希望如此)。它甚至有自己的部分:

http://upstart.ubuntu.com/cookbook/#the-rc-job

但是,要了解完整内容,我建议您从这里阅读:

http://upstart.ubuntu.com/cookbook/#really-understanding-start-on-and-stop-on

答案3

您的问题的其余部分现在应该可以通过 Upstart Cookbook 中的以下部分来回答:

答案4

你看到我的回答了吗当工作是任务时,“停在......”节的意义? 同样的答案适用于您问题的第一部分,如果用户在完成之前切换到另一个运行级别,它用于中止运行级别启动。

但我对第二部分一无所知。

相关内容