如何优雅杀死进程及其子孙进程

901 阅读1分钟

需求:杀死a进程并且与a有直接或间接关系的进程

思考:

  1. 杀死进程的方式,是选择批量kill,还是找到一个kill一个?
  2. 进程之间的关系是什么

在拿到这个需求前,脑海里第一想到的是:这不就是树的深度遍历嘛。如图:

图片.png

写shell脚本里写深度遍历?想到这我就有点迈不开腿了,linux里有那么多高级的命令,这种底层的算法还需要我写么。于是转向另一个方向的思考。

图片.png

于是这个方法就诞生啦:

#!/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的进程看看它的子孙有哪些

图片.png

现在要杀死这些进程简直易如反掌了。一条指令搞定: kill -9 $TOTAL_PID

ps:脚本中每条指令我都做了注释,有哪部分没看懂的小伙伴欢迎留言。如果有其他解决思路的同学也可以私我交流交流哟