![pkill はプロセスの直下の子孫以降のプロセスを強制終了しません](https://rvso.com/image/89151/pkill%20%E3%81%AF%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AE%E7%9B%B4%E4%B8%8B%E3%81%AE%E5%AD%90%E5%AD%AB%E4%BB%A5%E9%99%8D%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%82%92%E5%BC%B7%E5%88%B6%E7%B5%82%E4%BA%86%E3%81%97%E3%81%BE%E3%81%9B%E3%82%93.png)
プロセスのチェーンを終了したい。
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 を強制終了することで、名前空間全体を強制終了できます。