shell脚本:如何将进程运行时间与阈值进行比较?

时间:2011-12-12 12:48:19

标签: regex bash shell unix freebsd

Bash脚本应检查某个进程是否运行超过一定的分钟数,如果有,则将其终止。

我可以通过类似

的方式获得运行时间
ps -aux | grep ProgramName | grep -v grep | awk '{print $10}'

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

4 个答案:

答案 0 :(得分: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或任何其他版本的Unix(例如:Mac),其中-C ProgramName选项不可用。

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"}'

答案 1 :(得分: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

那就是说,我很乐意看到其他解决方案,因为我觉得我正在回收这些方法......

答案 2 :(得分: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给出的时间也可能采用以下格式:D-HH:MM:SS其中D是天数。

答案 3 :(得分: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`