多数のワーカー プロセスを実行している Python プログラムがあります。これは孤立したプロセスを避けるために適切に処理する必要があるため、すべてのワーカー プロセスをシャットダウンするシグナル ハンドラーを実装しました。
プログラムは多かれ少なかれ次のように開始します。
- プロセス プールを開始します (X 個のワーカーを開始します)
- シグナルハンドラを登録します (
signal.signal(signal.SIGTERM, my_signal_handler)
)。SIGINT
また、同じハンドラーを持つ別のシグナル ハンドラーを追加します。 - 別のスレッド ポーリング バックエンド (データベース) を開始し、タスクをプロセス プールに追加します。
- メイン スレッドで、結果のプロセス プールをポーリングします (
multiprocessing.Queue
個々のワーカーが結果を追加する結果があります)。
アイデアは、3 と 4 で開始された 2 つの別個のスレッドが、機械を介してタスクを実行し続けるというものです。
これを手動で開始して呼び出すkill -15 <pid>
かkill -2 <pid>
、すべてを正しくシャットダウンすると、プロセスがjoin()
. ドキュメントから読み取ると、rinitTERM
はプロセスに a を送信し、その後に を送信しCONT
ます。ただし、これを runit で実行すると、単に標準ok: down: <my_program>: 1s, normally up
の .
その後、手動でプロセスを強制終了すると、ログ ファイルでプロセスが正しくシャットダウンされたことを確認できます。私は何を間違っていますか?runit は、virtualenv をアクティブにするために作成した 3 行のシェル スクリプトのみを強制終了するようですが、実際の python プロセスは残します。
「実行」スクリプトを直接実行しても、実行kill
または Ctrl+C ( と同じSIGINT
) で正しくシャットダウンできます。