回答:
解決策は、別の方向から問題にアプローチすることです。Centrifyの開始基準を満たすために、既存のサービスを新しいCentrifyサービスに依存させる必要はなく、新しいCentrifyサービスを既存のサービスに依存させる必要があります。
たとえば、Upstart構成ファイルに/etc/init/centrify.conf
は次のように記述できます。
開始(cronの開始、autofsの開始、nisの開始)
これを英語に変換すると、次のように翻訳されます。
cron、autofs、nisのいずれかが開始する直前に Centrifyサービスを開始します。
cron、autofs、またはnisの起動順序は関係ありません。Upstartは、Centrifyが最初に起動するサービスよりも先に起動するようにします。したがって、これらのサービスのいずれかが起動する前にCentrifyが実行されます。
Centrifyが実行を開始するまで、Upstartは開始する最初のサービスの開始をブロックすることにも注意してください。
このような考え方に慣れると、非常にエレガントでシンプルになります。
start on (started nginx)
新しいスクリプトで使用できないのはなぜですか?
start on (started nginx)
「nginxの後にサービスを開始する」という意味です。これは、「サービスが必要なため、nginxをサービスの前に開始する」と同じではありません。
Jamesの答えは、1対1の依存関係で機能します。1対多の場合、つまり、サービスAがサービスB、C、およびDの前に開始されるようにするには、別のアプローチをとる必要があります。参照用に現在のポートマップスクリプトを見ることができますが、一般的なアプローチは次のとおりです。待機スクリプトを作成します。
シナリオ:サービスAを常に service-b、service-c、およびservice-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が実行されるまで開始を待たなければならないということです。service-a-waitジョブは、service-aが開始されるまで実行されるように設計されています。service-a-waitが終了すると、サービスb、c、およびdを自由に実行して実行できます。
これにより、その逆依存関係のいずれかが開始を試みる前に、service-aが稼働していることが保証されます。
注:この「start on ... or .. or ..」シナリオでは、「instance $ JOB」行が重要です。それ以外の場合、B、C、またはDのいずれかが最初に発射される場合にのみ、実際にブロックします。
(インスタンス化は正直なところより良い説明に値します。今のところ、それをしてください。)
normal exit 2
行はnormal exit 0 2
代わりにすべきではないのですか?script
セクションの最初の行は非常に明確にできexit 0
ます。