web-dev-qa-db-ja.com

スーパーバイザーによる子プロセスの停止

スーパーバイザーが直面する問題の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プロセスは強制終了されません。

53
FUD

同じ問題が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パッケージを試しました:

  • supervisor_3.0a8は機能しません。
  • supervisor_3.0b2-1は正常に機能します。
86
kuzavas

スーパーバイザーによって呼び出されたメインbashスクリプトの初期段階で次の操作を行うと、問題が修正されました。

trap "kill -- -$$" EXIT

これにより、supervisordによって強制終了された場合など、メインスクリプトが終了したときにプロセスグループ全体が強制終了されます。

12
Fred Yankowski

SIGKILLをプロセスグループ全体に送信する機能が、supervisordに最近追加されました。 github にありますが、まだ公式にはリリースされていません。

プロセスIDがファイルで使用可能な場合、 pid-proxy program を使用できます

6
Roger Hoover

次の記事には、この問題に関する詳細な説明があります。

http://veithen.github.io/2014/11/16/sigterm-propagation.html

3
Andreas Veithen

このスーパーバイザプログラムの設定を試してください。

stopasgroup=true
killasgroup=true
stopsignal=INT
2
Color

/conf.d/your-configuration.confファイルで優先順位を使用することもできます。たとえば、最初にzookeeperを実行し、次にkafka=を実行する場合、2つのプログラムを指定できます。

優先度が低いとは、プログラムが最初に起動し、最後に停止することを意味します。

0
bex