63

私がsupervisordで直面している問題の1つは、別のプロセスを生成するコマンドがある場合、supervisordがそれを強制終了できないことです。

たとえば、正常に実行されると次のような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

Supervisord 構成ファイルは次のようになります。

[program:zookeeper]
command=zkServer.sh start-foreground
autorestart=true
stopsignal=KILL

複数の子を持つこの種のプロセスは、それらを から停止する場合、supervisord によって適切に処理されませんsupervisorctl。したがって、supervisord からこれを実行し、supervisorctl から停止しようとすると、最上位プロセスのみが強制終了されますが、実際の Java プロセスは強制終了されません。

4

6 に答える 6

109

Rick Hanlon II が同じ問題に遭遇しました: https://coderwall.com/p/4tcw7w

Supervisordが親プロセスだけでなく子プロセスも停止するには、プログラム セクションでオプションstopasgroup=trueを設定する必要があります。

例は次のとおりです。

[program:some_django]
 command=python manage.py runserver
 directory=/dir/to/app
 stopasgroup=true

また、「stopasgroup」機能を持たない、supervisord の古いパッケージを使用している可能性があることに注意してください。Raspberry Pi でこれらの Debian パッケージを試しました。

  • Supervisor_3.0a8 が機能しません。
  • Supervisor_3.0b2-1 は期待どおりに動作します。
于 2013-12-13T12:10:38.547 に答える
13

Supervisord によって呼び出されるメインの bash スクリプトの早い段階で次のことを行うと、問題が解決しました。

trap "kill -- -$$" EXIT

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

于 2014-03-12T21:15:03.067 に答える
6

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

プロセス ID がファイルで利用可能な場合は、pid-proxy プログラムを使用できます。

于 2012-02-01T19:18:11.477 に答える
4

次の記事では、この問題について詳しく説明しています。

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

于 2015-01-11T19:31:42.900 に答える
0

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

優先順位が低いと、プログラムが最初に開始され、最後に停止することを意味します。

于 2016-11-05T02:35:57.787 に答える