Bash脚本应检查某个进程是否正在运行超过特定的分钟数,如果运行超过了几分钟,则将其杀死。

我可以通过类似的方式获取运行时间

ps -aux | grep ProgramName | grep -v grep | awk '{print $10}'

例如9:47.31 但是,我应该在哪里进一步检查并确定该阈值是否大于10分钟?

===============>>#1 票数:3 已采纳

这是用例需要的awk 1衬板:

ps -o etime -C ProgramName | awk -v MAX=600 '{split($0, a, ":"); if (length(a)==2) sec=a[1]*60+a[2]; else if (length(a)==3) sec=a[1]*3600+a[2]*60+a[3]; if (sec>MAX) print "Elapsed"; else print "Not Elapsed"}'

还要注意, ps -o etime -C ProgramName为您提供了自ProgramName运行以来的时间,因此您无需使用过于复杂的命令即可获得该时间。

重要提示:还请记住,对于已经运行了一天以上的进程,您将获得ps命令的输出,例如1-21:48:48 我的awk命令中没有涉及这种情况,但是您可以使用与上面显示的相同的awk's split命令。

更新:根据下面的注释,将此版本用于FreeBSD或-C ProgramName选项不可用的任何其他类型的Unix(例如Mac)。

ps -o etime=,command= | awk -v MAX=600 '/ProgramName/ && !/awk/ {split($1, a, ":"); if (length(a)==2) sec=a[1]*60+a[2]; else if (length(a)==3) sec=a[1]*3600+a[2]*60+a[3]; if (sec>MAX) print "Elapsed"; else print "Not Elapsed"}'

===============>>#2 票数:1

这是一种可能的方法:

for time in `ps auxwww  | awk '{print $10}'`; 
do  
SEC=`echo $time | cut -d":" -f2`; 
MIN=`echo $time | cut -d":" -f1`; 
TOTALTIMEINSEC=`echo $SEC+$MIN*60 | bc`; 
echo "the time in sec is:" $TOTALTIMEINSEC; done

顺便说一句,您不需要gerp -v grep,您可以执行以下操作:

grep [P]rogramName

就是说,我很想看看其他解决方案,因为我觉得自己正在回收这种方法...

===============>>#3 票数:1

首先,可以使用以下方法避免不必要的grep -v grep和awk跳舞:

$ ps -o time `pidof ProgramName`

在我的linux机器上,这似乎以HH:MM:SS格式给出时间。

考虑到pidof ProgName可能提供多个值,您可以使用tail -n +2|head -1或类似的值来处理。

现在获取持续时间,您可以将时间转换为秒:

$ seconds=$(printf "%d * 3600 + %d * 60 + %d\n" $(ps -o time $(pidof ProgramName)|tail -n +2|head -1|sed -e 's/:/ /g')|bc)

请注意, ps -o time time给出的ps -o time也可能采用以下格式: D-HH:MM:SS其中D是天数。

===============>>#4 票数:1

这将在您的程序运行少于一天的情况下起作用

THRESH=360
ps auxwww | grep [P]rocessname | awk '{print $10}' | sed -e 's/:/ /; s/\.[0-9]*$//' | while read m s; do 
  let total=${m}*60+${s}
  if [ $total -gt $THRESH ]; then 
    echo "${total} seconds total is over threshold of ${THRESH} seconds"
  fi
done

如果您想要更高的阈值,那么您将需要在处理时间的提取方面添加更多的逻辑,但是那时候我会将其放入perl / ruby​​脚本中并通过`ps auxww w `ps auxww获取信息。

  ask by Serge translate from so

未解决问题?本站智能推荐:

2回复

Grep在Shell中的两个时间戳之间记录

我正在编写一个脚本,我需要在两个给定的时间戳之间准确地grep日志。 我不想使用正则表达式,因为它不是完全证明。 有没有其他方法可以实现这一目标? 例如:时间范围04:15:00至05:15:00 日志格式:
2回复

用于验证csv字段的Shell脚本

我有一个包含20个字段的csv文件。 我想要一个脚本,根据以下几点检查文件是否有效: 它需要有20个用管道分隔的字段。 20个字段中的每个字段都应匹配一个正则表达式。 知道任何正则表达式不匹配的行号和字段号。 例如: 什么是最好的Shell工具? 你
2回复

如何循环遍历unix shell脚本中与正则表达式匹配的文件

我希望能够循环遍历与特定模式匹配的文件列表。 我可以让unix使用带有正则表达式的ls和egrep列出这些文件,但我找不到将其转换为迭代过程的方法。 我怀疑使用ls不是答案。 我们将非常感激地提供任何帮助。 我当前的ls命令如下所示: 我希望上面的内容匹配: MYF
4回复

Shell脚本:当我从文件中读取值时如何避免空字符

我在一个文件中有很多值,并且一行中我得到一个空值。 空值是该文件中的最后一个值。 我想避免使用空值,并从文件中获取最后一个整数值。 任何人都可以用正则表达式来帮助我。 我可以在这里发布我尝试过的内容。 当我尝试以上时,我没有得到最后一个整数值..它给了我null。 文件中的
5回复

使用BASH中的shell脚本将大型txt文件拆分为正则表达式中的200个较小的txt文件

嗨,大家好,我希望这个主题足够清楚,我在前面提到过的bin中没有找到任何具体的内容。 我试过在Perl或Python中实现它,但我想我可能会努力。 是否有一个简单的shell命令/管道将基于开始和结束的正则表达式将我的4mb .txt文件拆分成单独的.txt文件? 我提供了以下文件
2回复

gnu shell命令中基于模式的文件名过滤

可以说我有一个包含这些文件的active/目录 我想编写一条命令,仅在active/输出唯一的文件名(基于中间项的唯一性),并且与archive/已经存在的任何文件都不匹配(再次基于该中间术语)。 样本输出: 说明:输出foo.bar.abc或foo.bar.xyz都没有关
1回复

使用文本文件作为参数将Shell stderr重定向到另一个文件

我编写了一个bash脚本,它将读取参数中已经提供的文本文件,并将处理文本并将错误重定向到错误文件,并将其他输出重定向到list.txt文件。 我将这段代码作为$。/ script.sh argumentsfile.txt 2> error.txt运行 我的论点文件包含以下信息
1回复

使用unix shell在文本文件中的正则表达式之前插入回车符

我有一个凌乱的文本文件(大约30 Ko),其中包含必须使用Shell脚本重新组织的数据。 该文件显示一个简单的模式:“参数号”(值介于10001和10999之间)后跟其他几个值(浮点数)。 值用空格分隔。 我希望我的文件是:在每一行上,一个“参数编号”后跟它的值(一行中只有一个“参数编号”
2回复

优化查找和替换脚本

我开发了一个脚本来解析文本,并在特定条件下替换文本并生成新文件。 我想知道我是否可以优化它或任何其他建议 以下是样本记录 问候
3回复

创建条件bash脚本代码

我使用以下代码加载一些带有电子邮件的文本文件,并使用用户密码在系统中创建用户。 文本文件包含以下电子邮件 如果名称是大写的,我将其转换为小写,我能够使它工作。 现在我需要支持另一个输入而不是电子邮件,例如 但现在我不希望这种类型的输入将其转换为小写 有点像 这是