私が持っています [program:A]
、[program:B]
私のsupervisord.confで
B
依存A
、意味:
A
はB
の前に開始する必要があります。
監督者がこれを確実にする方法は?
supervisord
は、依存関係を直接サポートしていません。代わりに次のオプションがあります。
優先順位を使用します。 priority
のA
を低い値に設定すると、B
の前に開始され、B
の後にシャットダウンされます。 priority
のデフォルト値は999
です。
2つのプログラムも1つのグループに入れると、優先順位を指定して開始と停止の順序を調整し、それらを同時に開始および停止できます。
書きます イベントリスナーPROCESS_STATE
STARTING
- to -RUNNING
遷移とSTOPPING
イベントA
をリッスンします次に、これらのイベントに応じてsupervisord
を開始および停止するようにB
に指示します。 A
autostartがありますが、B
の自動起動を無効にして、イベントハンドラーが自動起動するようにします。
ショートカットを取りたい場合、そして イベントリスナー に関するドキュメントを読み飛ばし、プログラムがイベントを理解するようにプログラムを変更する必要がない場合は、次のようにします。
(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
_
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によって提案された解決策ですが、私は当時それを理解していませんでした。
this は私にとって素晴らしい解決策です!
私が使用した回避策は、プロセスに
autostart=false
を設定してから、bootstrapスクリプトをautostart=true
およびautorestart=false
(ワンショット)で作成することです。 。bootstrapは、プロセスごとにsupervisorctl start
を呼び出すシェルスクリプトにすることができます。supervisorctl start
は、プロセスが正常に開始されるまでブロックします。