web-dev-qa-db-ja.com

python監視プログラムの依存関係

私が持っています [program:A][program:B]私のsupervisord.confで

B依存A、意味:

ABの前に開始する必要があります。

監督者がこれを確実にする方法は?

28
Yueyoum

supervisordは、依存関係を直接サポートしていません。代わりに次のオプションがあります。

  • 優先順位を使用します。 priorityAを低い値に設定すると、Bの前に開始され、Bの後にシャットダウンされます。 priorityのデフォルト値は999です。

    2つのプログラムも1つのグループに入れると、優先順位を指定して開始と停止の順序を調整し、それらを同時に開始および停止できます。

  • 書きます イベントリスナーPROCESS_STATESTARTING- to -RUNNING遷移とSTOPPINGイベントAをリッスンします次に、これらのイベントに応じてsupervisordを開始および停止するようにBに指示します。 A autostartがありますが、Bの自動起動を無効にして、イベントハンドラーが自動起動するようにします。

23
Martijn Pieters

ショートカットを取りたい場合、そして イベントリスナー に関するドキュメントを読み飛ばし、プログラムがイベントを理解するようにプログラムを変更する必要がない場合は、次のようにします。

Bに依存する)プログラムAを直接開始する代わりに、Aが開始されるまでスリープしてからBを開始するBashスクリプトを開始できます。たとえば、PostgreSQLデータベースと、PostgreSQLの前に起動してはいけないサーバーがある場合:

_[program:server]
autorestart=true
command=/.../start-server.sh

[program:postgres]
user=postgres
autorestart=true
command=/usr/lib/postgresql/9.3/bin/postgres ...
_

そして_start-server.sh_の中:

_#!/bin/bash

# Wait until PostgreSQL started and listens on port 5432.
while [ -z "`netstat -tln | grep 5432`" ]; do
  echo 'Waiting for PostgreSQL to start ...'
  sleep 1
done
echo 'PostgreSQL started.'

# Start server.
echo 'Starting server...'
/.../really-start-the-server
_
7
KajMagnus

1つの解決策は、supervisorctlを使用することです。プログラムBのautostartをfalseに設定し、Aによって起動されたプログラムで、supervisorctl start B

例:

supervisor.cfg

[supervisord]
nodaemon=false
pidfile=/tmp/supervisor.pid
logfile=/logs/supervisor.log

[unix_http_server]
file=/var/run/supervisor.sock

[rpcinterface:supervisor]
supervisor.rpcinterface_factory=supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/run/supervisor.sock

[program:A]
command=do_a

[program:B]
command=do_b
autostart=false

do_aプログラムに含まれるもの:

#!/bin/bash
#do things
supervisorctl start B 

TBHそれは@drrzmrによって提案された解決策ですが、私は当時それを理解していませんでした。

3

this は私にとって素晴らしい解決策です!

私が使用した回避策は、プロセスにautostart=falseを設定してから、bootstrapスクリプトをautostart=trueおよびautorestart=false(ワンショット)で作成することです。 。bootstrapは、プロセスごとにsupervisorctl startを呼び出すシェルスクリプトにすることができます。supervisorctl startは、プロセスが正常に開始されるまでブロックします。

3
drrzmr