提到根据关键字杀死进程,第一反应一定是先ps -ef | grep 关键字,查找到满足的pid号列表,再kill
常见的写法就是:ps -ef | grep 关键字| grep -v grep | awk '{print $2}' | xargs kill -9,只需要一句话。
但是总会出现极端情况,导致报错,下面是我遇到的两个极端情况:
1、ps -ef | grep 关键字| grep -v grep 这一步的时候pid号还存在,但是xargs kill -9的时候进程已经推出,pid号不存在了,这时候就会报错,如下图所示,报错的原因是kill -9 后面没有pid号,实际上是kill命令的语法错误
解决办法:ps查询和kill分开,当pids确实存在再去kill
2、ps -ef | grep 关键字| grep -v grep 这一步的时候pid号存在,但是xargs kill -9的时候进程的pid号变化了,这时候就会报错,如下图,报错的原因就是kill -9 进程号的进程号不存在了,如果是在shell脚本里执行的话,命令返回值就不是0了,就会导致shell脚本退出
解决办法:kill -9 $pids || true 后面多加一个|| true,这样还是会报没有进程的错误,但是该命令的返回值是0,不会导致shell脚本退出
因此,考虑上面两点,最安全的办法是,封装一个函数,在sh脚本中调用该函数
function KillTask()
{
Task=$1
pids=$(ps -ef | grep $Task | grep -v grep |awk '{print $2}'| xargs)
if [ ! -z "$pids" ];then kill -9 $pids || true; fi
}
上面是封装好的函数,调用方法:KillTask 关键字