質問: プロセスとサブプロセスの両方を強制終了する方法は? 私は 質問 pythonのサブプロセスモジュールから複数行のメッセージを取得する方法を知りたいと尋ねました。問題は、テスト中にgnuchessプロセスを実行するpythonプロセスを強制終了しなければならないことです。コマンドラインで^ cを使用すると、pythonプロセスが強制終了されるようですが、gnuprocessは強制終了されません。gnuchessを殺すために、ps auxでpidを取得します| grep gnuchessを実行してkill -9 pidを実行します。 pythonとgnuchessプロセスの両方を終了する他の方法はありますか?
回答: プログラムが連携している場合、標準的な方法があります。 kill -- -42を実行します。ここで、42は親プロセスのpidです。これにより、プロセス42(pidがプロセスを意味する前のマイナス記号)によって導かれる プロセスグループ 内のすべてのプロセスに信号が送信されます。グループ)。通常、シェルプロンプトからpythonスクリプトを実行し、それが単にgnuchessをフォークする場合、2つのプロセスは同じプロセスグループにとどまるはずです。しかし、これはそうではないようです。なぜなら ctrl+c sigintをフォアグラウンドプロセスグループ全体に送信します。gnuchessは、それ自体がセッションリーダーになったため(ただし、なぜこれを行うのかわかりません)、またはダブルフォークしたため(pythonはgnuchessをフォークするシェルをフォークします)、独自のプロセスグループに属している可能性があります。ダブルフォークはおそらく避けられますが、コードを見ずにその方法を説明することはできません。gnuchessプロセスのpidを見つけるための合理的に信頼できるposix準拠の方法は次のとおりです。gnuchess_pids=$(ps -a -o pid= -o cmd= | awk '$2 ~ /(^|\/)gnuchess$/ {print $1}') 特定のunixバリアントは、pgrepのように、これを実現するより良い方法を持っている場合があります。