Celery: 事前にフォークされたワーカープロセスはTERMシグナルを無視できますか?

作成日 2018年06月04日  ·  3コメント  ·  ソース: celery/celery

全般的

影響を受けるバージョン:最新(4.1.1)

予想される行動

事前にフォークされたワーカーはsigtermシグナルを無視します。ウォームシャットダウンを担当する親プロセスのみがそれに反応し、子プロセスを正常にシャットダウンします。

現在の動作

事前にフォークされたワーカープロセスがsigtermを取得すると、すぐにシャットダウンします(例: kill <pid> ):

celery_1        | [2018-06-04 09:19:57,376: ERROR/MainProcess] Process 'ForkPoolWorker-2' pid:26 exited with 'signal 15 (SIGTERM)'

sigtermが親ワーカープロセスに到達すると、ウォームシャットダウンが実行されます。 その間に、事前にフォークされたワーカーもタームシグナルを受け取った場合、タスクは強制終了されます。

関連性

initシステムを使用してDockerコンテナで適切なシャットダウンセロリを実行する方法が見つかりません。
(メーリングリストを参照してください:https://groups.google.com/forum/#!topic / celery-users / 9UF_VyzRt8Q)。 シグナルという用語が親プロセスにのみ到達し、事前にフォークされたワーカーには到達しないことを確認する必要があるようです。 複数のセロリインスタンス(ビートと2つのキューなど)を使用してbashスクリプトを実行する場合、これは非常に難しいようです。

考えられる解決策

事前にフォークされたワーカープロセスがsigtermを無視できるようにする機能を追加することは可能ですか?

Deployment Prefork Workers Pool

最も参考になるコメント

役立つ提案をしてくれた@georgepsarakis@xirdnehに感謝します。 私はなんとか監督者と一緒に働くセットアップを得ることができました! 🎉
コンテナごとに1人のワーカーを配置することも非常に良い提案です。 どうもありがとう!

全てのコメント3件

Dockerコンテナー内で複数のプロセスを開始するときに適切なシグナル伝播を行うには、 supervisordなどのプロセスマネージャーが必要になる可能性があります。

詳細については、dockerが停止する方法の概要を示します

また、すでにdockerを使用している場合は、コンテナーごとに1人のワーカーを起動することをお勧めします。
管理が簡単で、コンテナにはそれほどオーバーヘッドがありません。 また、k8sなどのツールを使用すると、自動スケーリングを簡単に実行できます。

最後に一つだけ。 本当に独自のbashスクリプトをロールして複数のワーカーを管理したい場合は、各ワーカーを起動してから、SIGTERMが登場するまで無期限にスリープする必要があります。
それが起こったとき、あなたは行って労働者のPIDを取得し、それからそれぞれを優雅に止めることができます。
@georgepsarakisが指摘したように、これは基本的にスーパーバイザーが行うことです。

役立つ提案をしてくれた@georgepsarakis@xirdnehに感謝します。 私はなんとか監督者と一緒に働くセットアップを得ることができました! 🎉
コンテナごとに1人のワーカーを配置することも非常に良い提案です。 どうもありがとう!

このページは役に立ちましたか?
0 / 5 - 0 評価