私はUbuntuでresqueワーカーサービスを実行しており、それを管理するためにupstart(Ubuntuのデフォルトのプロセスマネージャ)を使用したいと思います。
resqueワーカースレッドの正しい終了順序は、最初にQUIT
シグナルを送信してから、プロセスが実行中のジョブを最初に完了するのを待つことです。その後、自分で停止する必要があります。ワーカープロセスがタイムリーに終了しない場合は、ジョブはまだ実行中であるため(停止する可能性がある)、ワーカープロセスがジョブを中断して終了TERM
するように指示する必要があります。明らかにこれがうまくいかない場合は、KILL
信号を送信する必要があります。
これを達成する方法は、pre-start script
シグナルを送信してからプロセスQUIT
が存在するか、タイムアウトが期限切れになるのを待つことです。
しかし、実際に起こるのは、オペレータが応答してQUIT
終了するとプロセスが開始してrespawn
再開されるため、明らかにプロセスの停止が発生しないことです。
とにかくプロセスを停止する必要がある場合は、スタートアップが再作成されるのを防ぐ方法はありますか?
答え1
私はこの問題を解決する2つの方法を見つけましたが、どちらも完璧ではありません。
- ヌーボーの金持ちには
kill signal
ルールがあります。kill signal QUIT
両方を設定すると、Upstartがプロセスにkill timeout 600
送信され、再送信する前に600秒待ちます。送信前にプロセスが終了しても大丈夫です。このアプローチにはいくつかの問題があります。 (a) タイムアウト後に送信する代わりに送信するため、resque ワーカーは正しく閉じられませんが、大きな問題ではありません。 (b)私が見つけたより悪い問題は、upstartがセッション(私たちの場合)のすべてのプロセスに「終了シグナル」を送信することです。これはresqueワーカースレッドの子プロセス操作を妨げる可能性があります(デフォルトのタスクは次のとおりです)。コアダンプがあります。)でプロセスを終了します。SIGQUIT
SIGKILL
SIGKILL
SIGKILL
SIGTERM
SIGQUIT
SIGQUIT
- 設定されたスタートアップから送信された信号をキャプチャする独自のラッパーを実装し(またはデフォルトを想定して
SIGTERM
)、すべての通常のシャットダウンを直接処理します。この場合、kill timeout
ラッパーが正常に終了し、時間が経過すると強制的に中断されるようにUpstartを十分な時間に設定することが重要です(この場合、タイムアウトはUpstartのタイムアウトよりわずかに短くなければなりません)。クリーンアップのためにUpstartで行いますSIGKILL
(要件に応じて良いアイデアかもしれません)。欠点:これを行うのは非常に複雑です。 Upstartが存在するのは、サービスごとに独自のプロセスマネージャを作成する必要がないためです。
どちらも行きたくない場合は、Upstartがサポートするよりも洗練されたシグナルメカニズムを実装できる他のプロセスマネージャがあります。通常、これらのメカニズムはUpstartで簡単に実装して問題のあるプロセスを管理できます。残念ながら、すべての状況でうまく機能する方法を見つけることは困難です。たとえば、私は試しました青い丸薬、書類上では見事ですが、作成時には目立つバグがあります。複数の信号と複数のタイムアウトを持つ複雑な信号メカニズムを試してみると、すべての信号を一度に(必ず正しい順序で送信する必要はありません)送信し、子プロセス。
追加する情報がある人がいる場合は、さらに回答を追加してください。内容が良い場合は、独自の回答の代わりに「回答」とマークすることもできます。
答え2
ヌボ金持ち出身レシピ:
事前停止を実行すると、ジョブターゲットはすでに「停止」しているため、どのような方法でもプロセスを終了でき、プロセスは再生成されません(再生成セクションがあっても)。
スクリプトの一部を送信できますQUIT
。pre-stop