按CPU时间过滤ps输出

时间:2014-09-08 20:04:53

标签: linux bash awk

不确定这是属于这里还是属于Linux和Unix。

我正在运行以下命令......:

ps -eo pid -eo pcpu -eo pmem -eo time -eo command | sort -k 2 -r | awk '/frmweb/ && !/PID/ && $2+0>0' > /tmp/deadpidlist.log

得到一个这样的好名单:

7445  3.4  0.3 00:00:06 frmweb webfile=HTTP-0,bosscars_prod_jpi
7570  2.2  0.2 00:00:01 frmweb webfile=HTTP-0,prod_sso
7550  1.3  0.2 00:00:01 frmweb webfile=HTTP-0,prod_sso
24730  0.8  0.3 00:01:55 frmweb webfile=HTTP-0,prod_sso
7557  0.8  0.2 00:00:00 frmweb webfile=HTTP-0,prod_sso
16893  0.6  0.2 00:02:19 frmweb webfile=HTTP-0,prod_sso
20906  0.5  0.2 00:01:40 frmweb webfile=HTTP-0,prod_sso

这很好,但是我的脚本喜欢选择刚刚生成的进程。所以我想做的是进一步过滤这个列表,只考虑超过一分钟CPU时间的PIDS(第4列)。

谢谢!

3 个答案:

答案 0 :(得分:1)

请改用:

... | awk '/frmweb/ && !/PID/ && $2+0>0 && substr($4,4,2)+0>1'

substr功能允许您从位置4开始的第4列中抓取2个字符(以及之后的2个)来测试>1条件。如果是,则该行将被打印。

或者,正如chepner在评论中所建议的那样:

... | awk '/frmweb/ && !/PID/ && $2+0>0 && $4!~"00:00:"'

答案 1 :(得分:0)

以防你想要任意的时间:

#!/bin/bash

SECONDS_THRESHOLD=60

while read pid pcpu pmem time command; do
    days="0"
    # in case of days, 01-00:00:00
    if [[ $time =~ /-/ ]]; then
        IFS=':-' read days hours minutes seconds <<< $time
    else
        IFS=':' read hours minutes seconds <<< $time
    fi
    totalSeconds=$( echo "$days * 86400 + $hours * 3600 + $minutes * 60 + $seconds" | bc )   
    if [[ $totalSeconds -gt $SECONDS_THRESHOLD ]]; then
        echo $pid $pcpu $pmem $time $command
    fi
done < <(ps -eo pid -eo pcpu -eo pmem -eo time -eo command | sort -k 2 -r | awk '/frmweb/ && !/PID/ && $2+0>0') > /tmp/deadpidlist.log

答案 2 :(得分:0)

ps进行排序。

ps kcputime -o pid,cputime,comm