Linux のshellであるプロセス(親プロセス)に属する子プロセスをすべて kill するには
AIに書いてもらいました
親プロセスの PID を
PPIDとして持つ子プロセスを全て終了させる
つまり「直系子」だけを対象にするか、孫・曾孫まで 再帰的に殺したいかで手順が変わります。
1. 直系子だけを一括で kill したい場合
pkill を使う(最も簡潔)
# 例: 親プロセスの PID が 1234 の子プロセスを全て SIGTERM で終了
pkill -TERM -P 1234
-
-P <pid>で 指定した PID の子プロセス を対象にします。 -
-TERMは送るシグナル。必要に応じて-KILL,-HUP等に変えてください。
kill + pgrep で同じことを手動で
kill -TERM $(pgrep -P 1234)
-
pgrep -P 1234が「PPID=1234 のプロセス ID をリストで返す」ので、その出力を
killに渡すことで一括終了します。
2. 子 → 孫 → その子まで 再帰的に全て kill したい場合
kill と pgrep をループで実行
kill_descendants() {
local parent=$1
# 子プロセスを取得
local children=$(pgrep -P "$parent")
for child in $children; do
# まず子の子(孫)まで処理
kill_descendants "$child"
# 子プロセス自体を終了
kill -TERM "$child"
done
}
# 使い方
kill_descendants 1234 # 1234 の全ての子孫を SIGTERM で終了
kill + ps を使った一行式(ループ不要)
# ① まず全ての子プロセスを取得
CHILDREN=$(ps -o pid= -g "$(ps -o pgid= -p 1234 | tr -d ' ')")
# ② それらを kill
kill -TERM $CHILDREN
注意
- この方法は 同一プロセスグループ(PGID)に属する全プロセスを対象にします。
親プロセスと子プロセスが必ずしも同じ PGID を持っているとは限らないので、
正確に「親から子孫まで」を捕捉したい場合は 再帰関数(上記
kill_descendants)を使うほうが安全です。
3. さらに安全に kill したい場合
| シグナル | 目的 | 使い方 |
|---|---|---|
SIGTERM(15) |
通常終了要求 | kill -TERM <pid> |
SIGINT(2) |
Ctrl?C と同様 | kill -INT <pid> |
SIGKILL(9) |
強制終了 | kill -KILL <pid> |
SIGSTOP |
凍結 | kill -STOP <pid> |
-
まずは
SIGTERMで試し、終了しないならSIGKILLを付けてください。 -
killall/pkillでもシグナルを指定できます。例:pkill -KILL -P 1234。
まとめ
| 目的 | コマンド例 |
|---|---|
| 直系子を一括終了 | pkill -TERM -P 1234 |
子プロセスを一括終了(kill+pgrep) |
kill -TERM $(pgrep -P 1234) |
| 子孫まで再帰的に終了 |
kill_descendants 1234(上記関数) |
| PGID 全体を終了 |
kill -TERM -<pgid>(PGID を取得して) |
実際に使う前に必ず PID(親プロセス)を確認し、
必要に応じてシグナルを変えてテストしてください。
もし「親プロセス自体も終了させる」場合は、上記手順の最後に kill -TERM 1234 を追加してください。