让 upstart 作业阻止其他作业停止

让 upstart 作业阻止其他作业停止

我正在尝试找到一种方法,让一个新启动的工作(当另一个工作停止时触发)阻止另一个工作真正停止。

基本上,我有一个运行的服务,让我们假装是 Apache,我想创建另一个 upstart 作业,它将阻止该服务关闭,除非满足某些条件。所以我创建了一个“任务”作业来执行一些检查,然后如果这些检查没有通过,就不应该允许 Apache 关闭。

我认为我可以做如下的事情:

start on stopping apache

task
script
if some_condition; then
    start --no-wait apache
fi
end script

但其他服务仍然关闭,只是立即重新启动。我不能接受这种情况,它根本就不能关闭。

我在上面的脚本中添加了一条sleep语句,它确实会延迟服务停止。因此,如果服务仍在运行,我认为我应该能够阻止它关闭。

答案1

因此,在深入研究 upstart 源代码后,upstart 脚本可以中止操作的唯一时间是在“pre”阶段(启动前/停止前)。当您使用触发器(例如)时start on stopping foo,服务会在“foo”阶段之后收到事件pre-stop,因此您无法在不先停止的情况下重新启动它。

但是,当您有条件时start on stopping foo,‘foo’ 服务不会停止,直到监听事件的服务完成。所以我最终做的就是一直循环,直到我检查的条件得到满足。这不是最好的解决方案,但它有效。


另一种解决方案是.override为服务创建一个文件,并将pre-stop脚本放入覆盖中。然后可以在中检查条件,pre-stop并发出start将阻止服务停止的命令。

不幸的是,由于其他复杂的原因,这对我来说不太适用,但对于任何尝试这样做的人来说,这可能是一个选择。

相关内容