Regex shell脚本:如何将进程运行时间与保存时间进行比较?

Regex shell脚本:如何将进程运行时间与保存时间进行比较?,regex,bash,shell,unix,freebsd,Regex,Bash,Shell,Unix,Freebsd,Bash脚本应该检查某个进程的运行时间是否超过一定的分钟数,如果超过一定的分钟数,则将其杀死 我可以通过以下方式获得运行时间 ps -aux | grep ProgramName | grep -v grep | awk '{print $10}' 例如,它给出了9:47.31。但我应该在哪里进一步检查它是否大于,比如说10分钟阈值?这里有一种可能的方法: for time in `ps auxwww | awk '{print $10}'`; do SEC=`echo $time |

Bash脚本应该检查某个进程的运行时间是否超过一定的分钟数,如果超过一定的分钟数,则将其杀死

我可以通过以下方式获得运行时间

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

例如,它给出了
9:47.31
。但我应该在哪里进一步检查它是否大于,比如说10分钟阈值?

这里有一种可能的方法:

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

也就是说,我很想看到其他解决方案,因为我觉得我正在回收这些方法…

这里有一种可能的方法:

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

这就是说,我希望看到其他解决方案,因为我觉得我正在循环使用这些方法…

首先,您可以通过以下方法避免不必要的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是天数。

首先,您可以避免不必要的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是天数。

以下是您需要的用于用例的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的split
命令

更新:根据下面的评论,在没有
-C ProgramName
选项的情况下,将此版本用于FreeBSD或任何其他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"}'

以下是您的用例所需的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的split
命令

更新:根据下面的评论,在没有
-C ProgramName
选项的情况下,将此版本用于FreeBSD或任何其他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"}'

这适用于程序运行不到一天的情况

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`

获取信息,这将适用于程序运行不到一天的情况

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`

服务器在FreeBSD共享主机上获取信息pidof'命令在那里不可用。在这种情况下,您希望将
pidof
替换为
pgrep
服务器位于FreeBSD共享主机上“pidof”命令在那里不可用。在这种情况下,您要用FreeBSD 6.2上的
pgrep
@anubhava-C开关替换
pidof
,则执行其他操作,所以,也许这些丑陋的grep仍然是需要的。请在上面的FreeBSD平台更新部分检查我的答案。我只在Update to-o etime-o命令中更改了ps选项,现在它可以工作了!谢谢你,阿努巴瓦!不客气,很高兴它成功了。
ps-o etime-o command
ps-o etime=-o command=
之间的区别在于前者中有一行额外的头。@FreeBSD 6.2上的anubhava-C开关做了其他事情,所以,也许这些丑陋的grep仍然是需要的。请在上面的FreeBSD平台更新部分检查我的答案。我只在Update to-o etime-o命令中更改了ps选项,现在它可以工作了!谢谢你,阿努巴瓦!不客气,很高兴它成功了。
ps-o etime-o command
ps-o etime=-o command=
之间的区别是前者中有一行额外的头。Box是FreeBSD 6.2,共享宿主,如果这使senseBox是FreeBSD 6.2,共享宿主,如果这使senseIt不喜欢秒部分的浮点性质:2*60+43.97:表达式中的语法错误(错误标记为“.97”)你是对的。我在sed逻辑中添加了另一位,以便从秒中删除浮点部分(如果存在)。它不喜欢秒部分的浮点性质:2*60+43.97:表达式中的语法错误(错误标记为“.97”)你是对的。我在sed逻辑中添加了另一个位,以便从秒中去掉浮点部分(如果它存在的话)。