当一个进程组 group leader 死掉后, 遗留下若干进程,要一个一个手工 kill 掉它们是比较讨厌的
下面这个函数可以帮你达到目的
比如当你想杀掉 android zygote的所有进程,可以用
killProcessGroup "android.process.acore" killProcessGroup "android.process.acore"
killProcessGroup() {
name=$1
echo "kill process group with member '$name' ..."
pgids=$(ps -e -o pgid,cmd | grep "[0-9] $name" | awk '{print $1}')
for pgid in $pgids
do
echo "kill -9 -$pgid"
$(kill -9 -$pgid)
done
}
要点:
1) ps 的参数很重要,
-e 是列出所有进程
-o 指定输出格式 -o pgid,cmd 是输出 groudid, 和命令行的名字
2)grep 是为了找到指定的 name 的进程
grep "[0-9] $name"
前面必须匹配一个数字, 这是为了过滤掉 自己因为它名字是 "grep $name"
当然可以再加一级过滤
grep "[0-9] $name" | grep -v grep
3) awk 是选择只需要 groupid
4) 最后也是最重要的是在kill 命令中, groupid 前面要加 - 号
kill -9 -$pgid