您好,欢迎访问沃航(武汉)科技有限公司官方网站
linux shell杀死进程树
2017-08-21 10:05:00

对于一个互联网运维人员来说,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


联系我们
地址:
武汉市洪山区蓝晶国际7栋903
QQ:
932773931
电话:
027-59761089-806
手机:
13397158231
邮箱:
jevian_ma@worldflying.cn
×
物联网组态平台
试用账号:123456
试用密码:123456
如需测试更多功能或者有疑问可发送邮件至:jevian_ma@worldflying.cn
×
积木编程平台
试用方式:试用手机号码注册即可使用
如需测试更多功能或者有疑问可发送邮件至:jevian_ma@worldflying.cn