Linuxでプロセスツリーをどのように殺しますか?[閉まっている]


14

SIGTERMをプロセスに送信すると、SIGTERMがそのすべての子プロセスに送信される場合があります。ただし、これが機能しない場合があります。

プロセスとそのすべての子プロセスを同時に強制終了できるコマンドまたはユーティリティはありますか?私は通常、すべてのPIDを1つの強制終了コマンドに手動で収集することに頼っていますが、それは愚かなことです。

このSOの質問は、perlでこれを行う方法を尋ねますが、仕事を成し遂げる何かが素晴らしいでしょう。


どういうわけか、pkill -9よりも強力なようですpkill
アンドリュー

回答:



13

プロセスがセッションIDを共有していると仮定すると(明示的にsetsid()を呼び出していない限り)、pkillを使用してセッションごとにプロセスを強制終了できます。

user@machine:~> ps -o pid,sess,cmd -U user
  PID  SESS CMD
12804 12804 -bash
12916 12804 ps -o pid,sess,cmd -U user
user@machine:~> sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ ps -o pid,sess,cmd -U user
  PID  SESS CMD
12804 12804 -bash
12920 12804 sh
12921 12804 sh
12922 12804 sh
12924 12804 sh
12926 12804 sh
12928 12804 sh
12937 12804 ps -o pid,sess,cmd -U user
sh-3.00$

別の端末からの場合:

pkill -9 -s 12804

その後、すべてが一気に死にます。

同様にプロセスグループごとに強制終了することもできますが、これは、関連するプロセスのチェーンではなく、すべて親より1レベル下にある多くの子にとってより便利です。


2

通常、応答するクライアントはsigtermを受け取り、それ自体をオフにして、フォークされたすべての子プロセスを終了します。一方、クライアントが応答しない場合、通常の終了信号はおそらく応答を引き起こしません。

そのため、SIGKILLの送信に進みます。SIGKILLは、システム自体にそのプロセスを停止するように指示します。I/ Oを待機するなど、プロセスが割り込み不可能なスリープ状態にある場合を除き、ほとんどの場合実行できます。入力または類似。

その場合、SIGKILLでさえプロセスに何もしなくなります。子プロセスはおそらく同様の遅延状態になります。

親プロセスはうまく終了するかもしれないが、子プロセスは殺すことができない境界ケースがあります。その後、ゾンビプロセスが発生します。ゾンビプロセスは、父親がなくなったためクリーンアップできませんが、何にも応答しません。それらを取り除く唯一の方法は再起動です。ただし、ほとんどの場合、使用しようとしたソケットがすでに枯れている間にPIDを取得するだけなので、ほとんど無害です。


2

Firefoxのプロセスツリーを強制終了したい場合、上記のコマンド「pkill -9 -s firefox」で強制終了できますか

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