对于一个互联网运维人员来说,linux的shell命令是一个不得不会的命令,并且杀死一个进程也是经常被使用到的。根据进程id杀死进程用的命令是kill,根据进程名杀死进程的命令是pkill或是killall。但是这些命令都不会去杀死由某个进程所产生的子进程。那么,有什么方式能将由某个进程所产生的子进程一同杀死呢?
下面我们就来讲讲如何通过shell脚本,连续递归杀死一个进程下的全部进程树的方法。
首先,根据进程名获取进程id,我们使用的是pidof命令。
如我们要获取进程A,我们就使用pidof A这个命令
然后我们要获取以当前进程为父进程的进程,我们使用ps -ef命令,然后通过awk来提取出来。
ps -ef |awk '{print $2 " " $3}'
这样就能获取父进程与子进程两个参数了,然后我们继续使用管道,寻找有父进程的那一行。
ps -ef |awk '{print $2 " " $3}' |grep "512"
(这里我们假设要删除的父进程为512)
然后提取进程,同样是使用awk方法。
ps -ef |awk '{print $2 " " $3}' |grep "512" |awk '{print $1}'
最后还要过滤掉自己就是512的那个进程。
ps -ef |awk '{print $2 " " $3}' |grep "512" |awk '{print $1}' |grep -v "512"
如果大家以为就这么完了,那就彻底上当了,哈哈。因为子进程也是有可能会派生子进程的,所以在kill掉他们前,需要先递归做一下刚才的事情,哈哈。
好了,废话也不多说了,直接上代码。
下面的代码假设要kill的进程名叫cert。
#!/bin/bash function findandkillchildren { PIDS = `ps -ef |awk '{print $2 " " $3}' |grep $1 |awk '{print $1}' |grep -v $1` for var in $PIDS do #在这里做了递归操作 findandkillchildren $var done kill $PIDS kill $1 } PID = `pidof cert` findandkillchildren $PID