Answers:
解决方案是从另一个方向解决问题:为了满足Centrify的启动标准,没有必要使现有服务依赖于新的Centrify服务,而是使新的Centrify服务依赖于现有服务。
例如,Upstart配置文件/etc/init/centrify.conf
可能会显示:
开始(启动cron或启动autofs或启动nis)
将其转换为英语,将其翻译为:
在 cron,autofs或nis启动之前(以先启动者为准)开始启动Centrify服务。
cron,autofs或nis的启动顺序无关紧要:Upstart将确保Centrify将在先启动任何服务之前启动,从而确保Centrify在任何这些服务启动之前都已运行。
还要注意,Upstart将阻止要启动的第一个服务的启动,直到Centrify开始运行。
一旦习惯了这种方式,就非常优雅和简单。
start on (started nginx)
在新脚本中使用?
start on (started nginx)
表示“在nginx之后启动我的服务”。这与“在需要我的服务之前先启动nginx”不同。
James的答案适用于1对1的依赖关系。对于一对多(即确保服务A在服务B,C和D之前启动),您需要采取另一种方法。您可以查看当前的portmap脚本以供参考,但这是常规方法:创建一个等待脚本。
场景:您希望服务A 始终在服务b,服务c和服务d之前运行。
# 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首先触发。
(诚实地说,实例化应该得到一个更好的解释。就目前而言,只需这样做即可。)
normal exit 2
行normal exit 0 2
呢?本script
节的第一行很明显可以exit 0
。