好的,第一篇文章!因此,我遇到这种情况,我需要通过特定进程名称检查超过 5 分钟的进程。问题在于,该系统是 CentOS 4 的定制版本,因此它具有 pmisc 21.4,而killall 直到 22.9 才合并 -o/--older-than。我无法选择升级系统,所以请不要建议这样做。这是一个内部系统,没有面向外部的访问权限,因此潜在的安全问题对该客户来说并不是一个大问题。
工程师正在研究一个解决方案,以找出为什么这个进程偶尔会挂起,但与此同时,我只需要 cron 一个脚本来检查该进程,如果它运行了超过 5 分钟,就将其杀死,因为通常只需要 30-45 秒即可完成。
我很确定这可以通过 ps 输出、一些egrep 和正则表达式语法来完成,但我不知道如何将它们组合在一起。
该过程称为“同步”。有人给了我以下建议的代码,但它似乎无法正常工作。
#!/bin/bash
for i in $(pgrep -f synch)
do
TIME=$(ps --no-headers -o etime $i | cut -d":" -f 2)
if [ "$TIME" -gt 4 ] ; then
kill $i
fi
done
答案1
请尝试-o etimes
改为以秒为单位给出时间,而不是人类友好的表示形式。然后你可以去掉cut
并检查时间是否至少为 300 秒:
#!/bin/bash
for i in $(pgrep -f synch)
do
TIME=$(ps --no-headers -o etimes $i)
if [ "$TIME" -ge 300 ] ; then
kill $i
fi
done
答案2
根据手册页,其格式为etime
,[[DD-]hh:]mm:ss
解析起来有点烦人,因为某些字段可能会丢失。
如果我们假设该进程只运行了很短一段时间,那么第一个字段应该是分钟。所以尝试用cut -d: -f1
代替-f2
.不过,如果该进程已经运行了一段时间,那么这会给你几个小时的时间......
(etimes
会好得多,但即使在 psmisc 22.2-5 中它似乎也不存在,所以你可能无法使用它。)
答案3
如果顽固的旧 CentOS 4 有find
,这可能值得尝试。
find /proc -maxdepth 1 -regex '/proc/[0-9]*' -type d -mmin +5 -exec kill {} \;
答案4
如果您不介意 C++,并且机器有足够的资源,您可以编写如下递归程序:
int main()
{
int Started;
int Passed;
RUNAGAIN:
system("time=$(date); echo $time > ~/timeStarted");
CHECKTIME:
system("passed0=$(date); echo $passed0 > ~/timePassed; passed 1=$(cut -c15,16 ~/timePassed); echo $passed1 > ~/timePassedCut; started0=$(cut -c15,16 ~/timeStarted; echo $started0 > ~/timeStartedCut");
ifstream STARTED("~/timeStartedCut");
STARTED>>Started;
STARTED.close();
ifstream PASSED("~/timePassedCut");
PASSED>>Passed;
PASSED.close();
int TimePassed
TimePassed = Started - Passed;
if(TimePassed>4)
{
system("killall *process name here*; ~/*process name here*//to start it again, omit if uneeded//");
goto RUNAGAIN;
}
else if(TimePassed<5)
{
goto CHECKTIME;
}
}
它将提取程序启动时的日期,剪切出小时中的分钟,将其写入文件,将文件作为变量加载,经过一段时间后执行相同的操作,如果启动时间分钟之间的差异计数并检查时间的分钟计数是否为 5 或更大会终止该进程。使用包含以下内容的基本 shell 脚本启动相关进程,以确保进程和计时器同时启动:
#!/bin/sh
~/*process name here* & ~/CheckTime