如何杀死运行超过36小时且在命令中包含某些短语的某些进程?

时间:2016-03-12 11:17:50

标签: linux kill kill-process

在Linux(CentOS 6)上,我想杀死包含" pkgacc"如果它运行超过36小时,则在其命令中(因此没有确切的命令,只是部分匹配)。

有相关问题:How do you kill all Linux processes that are older than a certain age?但是提供的任何解决方案对我都不起作用。

执行时:

 if [[ "$(uname)" = "Linux" ]];then killall --older-than 1h someprocessname;fi

它只是返回关于如何使用killall的killall使用页面,在其手册页中没有提及" - old-than"开关。

2 个答案:

答案 0 :(得分:1)

GNU coreutils中调用timeout之类的包装器中的程序比在事后搜索它们要容易得多。特别是因为timeout拥有它的过程,所以它没有任何歧义,它会杀死正确的过程。因此

timeout 36h pkgaccess --pkg_option --another_option package_name

我编写了pkgaccess命令的名称和选项,因为你没有给出它们。此过程将持续不超过36小时。

答案 1 :(得分:0)

我认为你可以做点什么

ps -eo pid,cmd,etime

然后你可以用grep搜索输出来解析输出, 类似的东西:

ps -eo pid,cmd,etime | grep pkgacc

你会得到一些带有一个或多个结果的输出,输出的最后一列必须是运行过程的时间,所以再多一点bash的努力 你可以检查时间是否超过36小时。

#!/bin/bash

FOO=$(ps -eo pid,cmd,etime | grep -m 1 pkgacc | awk '{ print $1" "$3 }'| sed -e 's/\://g')
IFS=' ' read -r -a array <<< "$FOO"
if [ "${array[1]}" -gt "360000" ]; then
    echo "kill the process: ${array[0]}"
else 
    echo "process was not found or time less than 36 hours"
fi

我认为这可以解决部分问题, 看到我没有明确地杀死过程但只是表明 这是什么。你可以从中改进这个想法。