18

Supervisord を停止したときにサブプロセスが確実に停止されるようにするにはどうすればよいですか?

Supervisord を使用して 2 つの Celery ワーカーを実行しています。各ワーカーのコマンドは次のとおりです。

command=/usr/local/myapp/src/manage.py celery worker --concurrency=1 --loglevel=INFO

Supervisord を起動すると、完全に実行されますが、実行するsudo service supervisord stopと、ワーカーが停止したと報告されます。

celery_1: stopped
celery_2: stopped

ただし、実行するps aux | grep celeryと、まだ実行されていることがわかります。

www-data 27667  0.0  1.5 318420 64360 ?        S    10:45   0:00 manage.py celery worker --concurrency=1 --loglevel=INFO
www-data 27668  0.0  1.5 318420 318416 ?        S    10:45   0:00 manage.py celery worker --concurrency=1 --loglevel=INFO
4

5 に答える 5

10

スーパーバイザーサービスを停止すると、セロリワーカーを管理しているスーパーバイザープロセスではなく、スーパーバイザーデーモンが停止すると思います

supervisorctl stop allワーカーを停止できるようにし、ワーカーを開始/再起動できるようにする必要があります

http://supervisord.org/running.html#running-supervisorctl

于 2013-06-12T15:29:57.310 に答える
9

私がここにたどり着いた理由は、スーパーバイザーを使用してセロリプロセスを開始および停止していたときに、セロリワーカーが停止せず、ワーカーの蓄積につながったためです。

stopsignal や killasgroup など、スーパーバイザーでさまざまな設定を試しました。誰も労働者を止めませんでした。

この時点で、セロリ プロセスは、停止時にワーカーにシグナルを送信していないように見えます。

私がやったことは、追加することでした:

ps auxww | grep 'celery worker' | awk '{print $2}' | xargs kill -9

私のスクリプトに。これはセロリのドキュメントからのものです

このコマンドの最後に、kill -9 の代わりに kill -TERM を試してみました。これにより、プロセスがより適切に強制終了されることを期待しています。しかし、それは常に1つのプロセスを残しました。

于 2015-01-26T14:48:15.197 に答える
1

私はdjangoチャネルでこのような問題を抱えていましたがstopasgroup=true、supervisor構成の設定(ここで提案されているように)は問題を修正しました。しかし、その理由はわかりません。

于 2016-11-28T11:30:55.607 に答える
1

確かではありませんが、この場合、スーパーバイザーが sh スクリプトを管理しているようです。Python スレッドではありません。ps auxf | grep celerySupervisord の実行中にを表示できますか? 次のようにコマンドを編集することもできます: command=python /path/to/manage.py ...、役立つでしょう。

于 2013-06-12T15:41:43.397 に答える