如何在其他Upstart作业之前确保一个Upstart作业启动?

Modified on: Sun, 10 Jun 2018 01:09:53 +0800

这是一个普遍的Upstart问题,但让我使用一个特定的案例:

Centrify是ActiveDirectory网关的NIS。它需要在任何依赖于它提供的身份验证服务的服务之前加载,例如, autofs,cron,nis,et al。

这已被证明是非常具有挑战性的,即使在尝试更改其他服务的依赖关系时(我认为我们不应该这样做,我不想触及其他Upstart工作,如果在一切皆有可能。)

建议?

作者:,Mark Russell

最佳答案

詹姆斯的答案适用于1对1的依赖。对于1对多,即为了确保服务A在服务B,C和D之前开始,您需要采取另一种方法。您可以查看当前的portmap脚本以供参考,但这里是一般方法:创建一个等待脚本。

场景:您希望服务A 始终在service-b,service-c和service-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运行。服务等待作业旨在运行直到service-a开始。一旦服务等待退出,现在服务b,c和d可以自由进行和运行。

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

注意:“instance $ JOB”行在此“start on ...或..或..”场景中非常重要。否则你只会先阻止B,C或D中的任何一个发射。

(实例化应该诚实地得到更好的解释。现在,就这样做。;)

作者:,Mark Russell

相关问答

添加新评论