プロセスグループをKILLしたい。
プロセスからfork したプロセスから forkしたプロセス、子プロセス・孫プロセスを除去したい。
プロセスグループの確認
ps -ejH
で PGIDとSIDを確認する
ps -ejH | PID PGID SID TTY TIME CMD 19666 19666 19666 ? 00:00:00 ssh 19668 19666 19666 ? 00:00:00 ssh
まともなプログラムを書いているなら、ForkしたときにPGIDを設定して子プロセスとして生成しているはず。
プロセスの親子関係や、プロセスグループ、プロセスの祖先と子孫がたどれるようにプロセスは生成される(ようにプログラムを書いているはず、もし辿れないなら意図的に別プロセスで起動しようとして失敗しているかもしれない。)
プロセスをkillする
親のプロセスIDがわかるなら、pkillを使うのが早い
pkill -P 親のPID
killコマンドで負数を指定する(pkillがない場合など)
kill -- -1234
プロセスを識別せずに全部消したい
commandの文字列にマッチさせてすべて除去したいのであれば killall
が使える。
killall でコマンドを全部消す。
killall /usr/bin/ssh
複数起動していて残すべきものがない場合は、すべて消せる。そのときは killall で手っ取り早い。
また、pkillでもできる。
pkill /usr/bin/ssh
プロセスを消す場合には起動時に覚えておく。
pidファイルを作って保存しておけば、PIDファイルを見てグループを除去できる。
普段使わないから、なかなか覚えられないんですよねぇ。