web-dev-qa-db-ja.com

Linuxでプロセスツリーをどのように殺すのですか?

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

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

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

14
itsadok

これは SO質問 でカバーされます。

13
goo

プロセスがセッションIDを共有していると仮定すると(setsid()を明示的に呼び出さない限り、プロセスIDを共有する必要があります)、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

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

同様に、プロセスグループごとにkillすることもできますが、これは、関連付けられたプロセスのチェーンではなく、すべて親より1つ下のレベルにある多くの子にとってより役立つ傾向があります。

13
James F

Firefoxのプロセスツリーを強制終了する場合、上記のコマンド「pkill -9 -s firefox」で強制終了することは可能ですか。

2
Jerry

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

次に、SIGKILLの送信に進みます。SIGKILLは、システム自体にMake Now Process Stop Now、Nowを送信します。これは、プロセスがI/Oを待機するなどの割り込み不可能なスリープ状態にある場合を除いて、ほとんどの場合に実行できます。入力または同様。

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

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

2
towo