スーパーバイザーが直面する問題の1つは、別のプロセスを生成するコマンドがある場合、スーパーバイザーはそれを強制終了できないことです。
たとえば、私はJavaプロセスを持っています。
$ zkServer.sh start-foreground
$ ps -eaf | grep zk
user 30404 28280 0 09:21 pts/2 00:00:00 bash zkServer.sh start-foreground
user 30413 30404 76 09:21 pts/2 00:00:10 Java -Dzookeeper.something..something
スーパーバイザ設定ファイルは次のようになります。
[program:zookeeper]
command=zkServer.sh start-foreground
autorestart=true
stopsignal=KILL
複数の子を持つこれらの種類のプロセスは、supervisorctl
からそれらを停止することになると、supervisordによってうまく処理されません。したがって、supervisordからこれを実行し、supervisorctlから停止しようとすると、最上位プロセスのみが強制終了されますが、実際のJavaプロセスは強制終了されません。
同じ問題がRick Hanlon IIによってここで発生しました: https://coderwall.com/p/4tcw7w
オプションstopasgroup = trueは、親プロセスだけでなく子プロセスも停止するために、supervisordのプログラムセクションで設定する必要があります。
例は次のとおりです。
[program:some_Django]
command=python manage.py runserver
directory=/dir/to/app
stopasgroup=true
また、「stopasgroup」機能を持たない古いスーパバイザパッケージがある場合があることに留意してください。 Raspberry PiでこれらのDebianパッケージを試しました:
スーパーバイザーによって呼び出されたメインbashスクリプトの初期段階で次の操作を行うと、問題が修正されました。
trap "kill -- -$$" EXIT
これにより、supervisordによって強制終了された場合など、メインスクリプトが終了したときにプロセスグループ全体が強制終了されます。
SIGKILLをプロセスグループ全体に送信する機能が、supervisordに最近追加されました。 github にありますが、まだ公式にはリリースされていません。
プロセスIDがファイルで使用可能な場合、 pid-proxy program を使用できます
次の記事には、この問題に関する詳細な説明があります。
http://veithen.github.io/2014/11/16/sigterm-propagation.html
このスーパーバイザプログラムの設定を試してください。
stopasgroup=true
killasgroup=true
stopsignal=INT
/conf.d/your-configuration.conf
ファイルで優先順位を使用することもできます。たとえば、最初にzookeeperを実行し、次にkafka=を実行する場合、2つのプログラムを指定できます。
優先度が低いとは、プログラムが最初に起動し、最後に停止することを意味します。