pkill はプロセスの直下の子孫以降のプロセスを強制終了しません

pkill はプロセスの直下の子孫以降のプロセスを強制終了しません

プロセスのチェーンを終了したい。

PID  PPID
100  XXX
101  100
102  101

PID 100 と 101を使用するとpkill -P 100予想どおりに終了しますが、102 は PPID として init に指定されます。

プロセスの直接の子孫を超えて連鎖プロセスを強制終了し続けるように pkill を強制するにはどうすればよいですか?

答え1

pkillまさに指示したとおりに動作します。つまり、親が 100 であるプロセスを強制終了しました。親の親が 100 であるプロセスは強制終了していません。

Linux にpkillも FreeBSD にもプロセス ツリーをトラバースするオプションはありません。 を呼び出しpstree -lて出力を解析することができます。

A が B をフォークし、B が C をフォークし、その後 B が停止した場合、A と C を接続できる親子関係は残らないことに注意してください。

これらすべてのプロセスを終了する方法があるかもしれませんが、過剰に実行されてしまう可能性があるので注意してください。

に負のプロセスIDを渡すとkill、プロセス全体が強制終了されます。プロセスグループこれはアトミックなので、実行中にプロセスの 1 つがフォークした場合でも機能しますkill。これは、自身のグループに配置されていないプロセスのみを強制終了し、同じプロセス グループ内にある親プロセスとその他のプロセスも強制終了します。 を実行するps -o pgid …と、プロセスのプロセス グループ ID が表示されます。

終了したいすべてのプロセスが特定のファイルを開いている場合は、fuser -k /some/file次のようにして終了できます。全てこのファイルを開いているプロセス。

Linuxでのもう一つの選択肢はプロセスを独自のPID名前空間で実行する次に、名前空間内から疑似 PGID -1 を強制終了することで、名前空間全体を強制終了できます。

関連情報