1つのUpstartジョブが他のUpstartジョブの前に開始されるようにするにはどうすればよいですか?


33

これは一般的なUpstartの質問ですが、特定のケースを使用させてください。

Centrifyは、NISからActiveDirectoryへのゲートウェイです。autofs、cron、nisなど、提供する認証サービスに依存するサービスの前にロードする必要があります。

これは、他のサービスの依存関係を変更しようとしても、達成するのが非常に困難であることが証明されています(とにかく行う必要があるとは思わない、可能な限り他のUpstartジョブに触れたくない) 。

提案?

回答:


29

解決策は、別の方向から問題にアプローチすることです。Centrifyの開始基準を満たすために、既存のサービスを新しいCentrifyサービスに依存させる必要はなく、新しいCentrifyサービスを既存のサービスに依存させる必要があります。

たとえば、Upstart構成ファイルに/etc/init/centrify.confは次のように記述できます。

開始(cronの開始、autofsの開始、nisの開始)

これを英語に変換すると、次のように翻訳されます。

cron、autofs、nisのいずれかが開始する直前に Centrifyサービスを開始します。

cron、autofs、またはnisの起動順序は関係ありません。Upstartは、Centrifyが最初に起動するサービスよりも先に起動するようにします。したがって、これらのサービスのいずれかが起動する前にCentrifyが実行されます。

Centrifyが実行を開始するまで、Upstartは開始する最初のサービスの開始をブロックすることにも注意してください。

このような考え方に慣れると、非常にエレガントでシンプルになります。


4
これは完全に逆に思えます。他のものがそれに依存しているときに、なぜあるサービスのconfスクリプトを変更する必要があるのですか?
ベンw

3
@benw所有していないサービスの既存の設定を変更する必要がないように。
Paccc

1
@Pacccは、nginxに依存する新しいスクリプトを作成するときに、nginxのconfスクリプトを変更する必要があります...私は所有していません。
ベンw

2
@benw start on (started nginx)新しいスクリプトで使用できないのはなぜですか?
Paccc

2
@Pacccはそうではありません。start on (started nginx)「nginxの後にサービスを開始する」という意味です。これは、「サービスが必要なため、nginxをサービスの前に開始する」と同じではありません。
病気14年

12

Jamesの答えは、1対1の依存関係で機能します。1対多の場合、つまり、サービスAがサービスB、C、およびDの前に開始されるようにするには、別のアプローチをとる必要があります。参照用に現在のポートマップスクリプトを見ることができますが、一般的なアプローチは次のとおりです。待機スクリプトを作成します。

シナリオ:サービス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-waitジョブは、service-aが開始されるまで実行されるように設計されています。service-a-waitが終了すると、サービスb、c、およびdを自由に実行して実行できます。

これにより、その逆依存関係のいずれかが開始を試みる前に、service-aが稼働していることが保証されます。

注:この「start on ... or .. or ..」シナリオでは、「instance $ JOB」行が重要です。それ以外の場合、B、C、またはDのいずれかが最初に発射される場合にのみ、実際にブロックします。

(インスタンス化は正直なところより良い説明に値します。今のところ、それをしてください。)


3
私はこれを取得しません...サービスAの開始とサービスBの開始の間の競合状態を防ぐものは何ですか?スクリプトが「start-service-a」を完了したことをupstartがどのように知るかわかりません…(多分Upstartの
見苦しい

@マーク・ラッセル:そのnormal exit 2行はnormal exit 0 2代わりにすべきではないのですか?scriptセクションの最初の行は非常に明確にできexit 0ます。
凍結14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.