
場合によっては、プロセスに SIGTERM を送信すると、そのプロセスのすべての子プロセスに SIGTERM が送信されます。ただし、これが機能しない場合もあります。
プロセスとそのすべての子プロセスを同時に終了できるコマンドまたはユーティリティはありますか? 通常、すべての pid を 1 つの kill コマンドに手動で収集しますが、それは愚かな気がします。
このSOの質問これを Perl でどう行うかを尋ねていますが、目的を達成できるものであれば何でも結構です。
答え1
これ質問ですこれをカバーします。
答え2
プロセスがセッション識別子を共有していると仮定すると (明示的に 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 レベル下にある多数の子に対してより便利な傾向があります。
答え3
通常、応答するクライアントは sigterm を受信して自身を終了し、それによって分岐したすべての子プロセスを終了します。一方、クライアントが応答しない場合は、通常の終了信号では応答が返されない可能性があります。
そこで、次に SIGKILL を送信して、システム自体に「そのプロセスを今すぐ停止する」ように指示します。これは、プロセスが I/O 入力の待機中など、割り込み不可能なスリープ状態にある場合を除き、ほとんどの場合に実行できます。
その場合、SIGKILL を実行してもプロセスには何も行われず、子プロセスも同様に遅延状態になる可能性があります。
親プロセスは問題なく終了するが、子プロセスは終了できないという境界ケースがあります。その場合、親プロセスがなくなったためクリーンアップできないゾンビ プロセスになりますが、このプロセスは何も応答しません。このプロセスを取り除く唯一の方法は再起動です。ただし、ほとんどの場合、このプロセスはまったく無害です。このプロセスが行うことは PID を占有することだけで、使用しようとしたソケットはすでに消滅しているからです。
答え4
Firefox のプロセスツリーを強制終了したい場合、上記のコマンド「pkill -9 -s firefox」で強制終了できますか?