在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"开关。
答案 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
我认为这可以解决部分问题, 看到我没有明确地杀死过程但只是表明 这是什么。你可以从中改进这个想法。