13397158231   jevian_ma@worldflying.cn

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


优秀产品推荐:可编程网络IO控制器

上一篇:微信服务号获取全部关注用户的详细信息

下一篇:linux下限制某个文件夹容量

联系我们

  • 地址:武汉市东湖高新开发区光谷总部国际1栋2412室
  • QQ:932773931
  • 电话:027-59761089-806
  • 手机:13397158231
  • 邮箱:jevian_ma@worldflying.cn

关注公众号

扫码添加微信

沃航(武汉)科技有限公司版权所有

备案号:鄂ICP备16014230号-1

本网站由提供CDN加速/云存储服务