如何确保一个Upstart作业先于其他Upstart作业开始?


33

这是一个一般性的新贵问题,但让我使用一个特定的案例:

Centrify是一个NIS到ActiveDirectory网关。它需要先加载任何依赖于它提供的身份验证服务的服务,例如autofs,cron,nis等。

事实证明,这很难实现,即使试图更改其他服务的依赖关系(我也不认为我们应该这样做,如果可能的话,我也不想接触其他Upstart的工作) 。

有什么建议吗?

Answers:


29

解决方案是从另一个方向解决问题:为了满足Centrify的启动标准,没有必要使现有服务依赖于新的Centrify服务,而是使新的Centrify服务依赖于现有服务。

例如,Upstart配置文件/etc/init/centrify.conf可能会显示:

开始(启动cron或启动autofs或启动nis)

将其转换为英语,将其翻译为:

cron,autofs或nis启动之前(以先启动者为准)开始启动Centrify服务。

cron,autofs或nis的启动顺序无关紧要:Upstart将确保Centrify将在先启动任何服务之前启动,从而确保Centrify在任何这些服务启动之前都已运行。

还要注意,Upstart将阻止要启动的第一个服务的启动,直到Centrify开始运行。

一旦习惯了这种方式,就非常优雅和简单。


4
这对我来说似乎完全是倒退。为什么要在其他事情取决于对一个服务的conf脚本修改
ben w

3
@benw这样您就不必修改您不拥有的服务的现有设置。
Paccc

1
@Paccc当我编写一个依赖于nginx的新脚本时,我必须为nginx修改conf脚本……我不拥有它。
ben w

2
@benw为什么不能start on (started nginx)在新脚本中使用?
Paccc

2
@Paccc不是真的。start on (started nginx)表示“在nginx之后启动我的服务”。这与“在需要我的服务之前先启动nginx”不同。
生病了

12

James的答案适用于1对1的依赖关系。对于一对多(即确保服务A在服务B,C和D之前启动),您需要采取另一种方法。您可以查看当前的portmap脚本以供参考,但这是常规方法:创建一个等待脚本。

场景:您希望服务A 始终在服务b,服务c和服务d之前运行。

解决方案:为服务A创建一个等待脚本。将其称为“ /etc/init/service-a-wait.conf”

# service-a-wait

start on (starting service-b 
    or starting service-c
    or starting service-d)
stop on (started service-a or stopped service-a)

# We know that we have more than one job that needs to wait for service-a and
# will make use of this service, so we need to instantiate.
instance $JOB

# Needed to make starting the job successful despite being killed
normal exit 2
task

script

    status service-a | grep -q "start/running" && exit 0
    start service-a || true

    # Waiting forever is ok.. upstart will kill this job when
    # the service-a we tried to start above either starts or stops
    while sleep 3600 ; do :; done

end script

简而言之,这意味着:当服务b,c或d表示要启动时,他们必须等待启动,直到服务a运行为止。等待服务的作业被设计为一直运行到服务a启动为止。一旦等待服务退出,现在服务b,c和d可以自由继续运行。

这将确保service-a在任何反向依赖项尝试启动之前已启动并正在运行。

注意:在这种“开始于...或..或..”方案中,“ instance $ JOB”行很重要。否则,您只会真正阻止B,C或D首先触发。

(诚​​实地说,实例化应该得到一个更好的解释。就目前而言,只需这样做即可。)


3
我不明白……是什么阻止了启动服务A和服务B继续启动之间的竞争状况?我看不到新贵如何知道脚本已完成“启动服务-a”…(也许将此归咎于Upstart的伪劣文档……)
Chris Pacejo 2013年

@马克罗素:难道不应该normal exit 2normal exit 0 2呢?本script节的第一行很明显可以exit 0
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.