不确定这是属于这里还是属于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列)。
谢谢!
答案 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