杀死一个超过 X 分钟的命名进程? (没有killall -o)

杀死一个超过 X 分钟的命名进程? (没有killall -o)

好的,第一篇文章!因此,我遇到这种情况,我需要通过特定进程名称检查超过 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

相关内容