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


9

私は尋ねた 質問を Pythonのsubprocessモジュールからのメッセージの複数行を取得する方法を知っています。

問題は、テストの過程で、gnuchessプロセスを実行するpythonプロセスを強制終了する必要があったことです。コマンドラインで^ cを使用すると、Pythonプロセスは終了しますが、gnuprocessは終了しません。

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


8
ランダム追記:あなたが使用することができますpkill名前でプロセスを殺すために、あなたのようにps aux | grep gnuchesskill -9 PIDだけになることができますpkill -9 gnuchess
マイケルMrozek

回答:


10

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

通常、Pythonスクリプトをシェルプロンプトから実行し、単純にforkするgnuchess場合、2つのプロセスは同じプロセスグループに残る必要があります。Ctrl+ はフォアグラウンドプロセスグループ全体にC送信SIGINTされるため、これは当てはまりません。

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


プロセスのPIDを見つける合理的な信頼性とPOSIX準拠の方法gnuchess

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

特定のUNIXバリアントには、これを実現するためのより良い方法があるかもしれませんpgrep


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.