进入运行级别之前进行顺序挂钩?

进入运行级别之前进行顺序挂钩?

我遇到了一个非常特殊的问题,我整晚都在与 Upstart 斗争,但没有成功。

在我的特定情况下,我有一台带有一堆 PXE 启动客户端的服务器。客户端的数据存储在 MySQL 中。当我关闭服务器时,在发生任何事情之前,我需要关闭所有 PXE 客户端。在旧的顺序 sysvinit 世界中,这是小菜一碟:只需将远程关闭脚本放在序列的早期,在网络、portmap、nfs、mysql 关闭之前。即使所有客户端关闭需要 10 分钟(但通常 30 秒就足够了),这也是可以的。

使用 upstart,我无论如何都无法让客户端在服务器关闭之前关闭。我设法在 mysql 关闭之前执行了脚本,但这还不够,因为看起来 PXE 客户端真正需要的网络和/或其他支持内容都关闭了,所以它们的 NFS 安装会化为乌有,并且永远不会关闭。不过,只要服务器恢复,它们就会关闭。

我最接近得到我想要的是这样的:

kill timeout 70

start on runlevel [016] and (stopping mysql or stopping portmap or stopping idmapd or stopping statd)

task

exec the-script-that-shuts-clients-down.sh

该脚本告诉所有机器关闭,然后密切关注它们(每秒发送一次 ping),并且只有当它们全部关闭或脚本感到无聊并放弃时,服务器才会继续关闭序列。

现在,使用 Upstart,我的脚本在大约 7 秒后就会被终止。即使有上述 70 秒的超时时间。

理想情况下,我想执行该脚本任何其他操作都是由运行级别开关触发的,但 Google 说我在这方面运气不佳。Upstart 中没有顺序机制 - 甚至“向后兼容”rc 也与其他 upstart 服务并行执行。

对此有什么想法吗?我正在运行 Ubuntu 10.10。

答案1

我设法用这个解决了我的问题:

kill timeout 70

start on runlevel RUNLEVEL=[016] PREVLEVEL=[2345] and (starting rc RUNLEVEL=[016] or stopping mysql or stopping portmap or stopping idmapd or stopping statd)

task

exec the-script-that-shuts-clients-down.sh

嗯,差不多,因为看起来 Upstart 有一个专门针对 rc 挂钩的小错误。至少在 Ubuntu 10.10 中是这样的。我手头没有 11.04 来确认这一点。

现在的解决方法如下:

关闭客户端的脚本.sh,在退出之前我会

touch /etc/init/my-job.conf

其中 my-job.conf 包含上述内容。到目前为止,它每次都能从启动/启动中解脱出 rc。

另一个问题是,如果我写启动 rc而不是启动 rc RUNLEVEL=[016]然后 upstart 在启动时也会卡在 rc 上(并且相同的 touch 命令可以解除卡住)。

相关内容