web-dev-qa-db-ja.com

プロセスとサブプロセスの両方を強制終了する方法は?

私は 質問 Pythonのサブプロセスモジュールから複数行のメッセージを取得する方法を知りたいと尋ねました。

問題は、テスト中にgnuchessプロセスを実行するpythonプロセスを強制終了しなければならないことです。コマンドラインで^ cを使用すると、pythonプロセスが強制終了されるようですが、gnuprocessは強制終了されません。

Gnuchessを殺すために、ps auxでpidを取得します| grep gnuchessを実行してkill -9 PIDを実行します。 pythonとgnuchessプロセスの両方を終了する他の方法はありますか?

9
prosseek

プログラムが連携している場合、標準的な方法があります。 kill -- -42を実行します。ここで、42は親プロセスのPIDです。これにより、プロセス42(pidがプロセスを意味する前のマイナス記号)によって導かれる プロセスグループ 内のすべてのプロセスに信号が送信されます。グループ)。

通常、シェルプロンプトからpythonスクリプトを実行し、それが単にgnuchessをフォークする場合、2つのプロセスは同じプロセスグループにとどまるはずです。しかし、これはそうではないようです。なぜなら Ctrl+CSIGINTをフォアグラウンドプロセスグループ全体に送信します。

Gnuchessは、それ自体がセッションリーダーになったため(ただし、なぜこれを行うのかわかりません)、またはダブルフォークしたため(pythonはgnuchessをフォークするシェルをフォークします)、独自のプロセスグループに属している可能性があります。ダブルフォークはおそらく避けられますが、コードを見ずにその方法を説明することはできません。


gnuchessプロセスのpidを見つけるための合理的に信頼できるPOSIX準拠の方法は次のとおりです。

gnuchess_pids=$(ps -A -o pid= -o cmd= | awk '$2 ~ /(^|\/)gnuchess$/ {print $1}')

特定のUNIXバリアントは、pgrepのように、これを実現するより良い方法を持っている場合があります。

試してみてください:

pkill <processname>
0
Quandary