Bash脚本应检查某个进程是否运行超过一定的分钟数,如果有,则将其终止。
我可以通过类似
的方式获得运行时间ps -aux | grep ProgramName | grep -v grep | awk '{print $10}'
例如,9:47.31
。但是我在哪里进一步检查是否大于10分钟阈值?
答案 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`