需求:杀死a进程并且与a有直接或间接关系的进程
思考:
- 杀死进程的方式,是选择批量kill,还是找到一个kill一个?
- 进程之间的关系是什么
在拿到这个需求前,脑海里第一想到的是:这不就是树的深度遍历嘛。如图:
写shell脚本里写深度遍历?想到这我就有点迈不开腿了,linux里有那么多高级的命令,这种底层的算法还需要我写么。于是转向另一个方向的思考。
于是这个方法就诞生啦:
#!/bin/bash
function getPID(){
#局部变量父进程
local MY_PPID=$1
#全局变量所有进程
TOTAL_PID="$TOTAL_PID $MY_PPID"
#得到父进程的所有子进程
local MY_PID=$(ps -ef|grep $MY_PPID|grep -v grep|grep -v bash|awk 'NR>1{print $2}')
#打印该父进程有哪些子进程
echo $MY_PPID:$MY_PID
#递归出口:如果父进程没有子进程则return
if [ ${#MY_PID} -eq 0 ]
then
return
fi
#把子进程转换成数组
local PID_ARR=($MY_PID)
#对每个子进程递归调用getPID方法,获取子进程的子进程的子进程。。。直到没有子进程
for i in ${!PID_ARR[@]}
do
getPID ${PID_ARR[$i]}
done
}
getPID $1
echo 所有的PID:$TOTAL_PID
随便找个进程演示脚本执行结果。如看看进程号为23的进程看看它的子孙有哪些
现在要杀死这些进程简直易如反掌了。一条指令搞定: kill -9 $TOTAL_PID
ps:脚本中每条指令我都做了注释,有哪部分没看懂的小伙伴欢迎留言。如果有其他解决思路的同学也可以私我交流交流哟