脚本:
echo $1 $n
while true
do
ps -aux | awk '{print $1 "\t" $3 "\t" $4 "\t" $11}' > task.log
while IFS=' ' read r
do
echo $r
done < task.log | grep "$n" | awk '/a/{sum+=$1} END{print"Total CPU Usage:", sum}' >> monitor2.log
sleep $1
done
这是一个简单的脚本,可通过在task.log中通过输出-aux结果查看cpu的使用情况,并让grep和awk通过输入关键字来对其求和求和
问题在于,结果总是在我运行./monitor1.sh 2 firefox
CPU总使用量:0
我测试了是否将grep用firefox替换$ n而不是变量,输出为
总CPU使用率:1.1
答案 0 :(得分:1)
在您的脚本中:
n=$2
或只是使用$2
位置变量tee
对其进行管道操作ps -axu
然后用awk
限制列看起来很奇怪。 ps
可以自行格式化输出ps | grep
很不好,为此使用pgrep
修复后的脚本可能如下所示:
while true; do
cpuusage=$(
pgrep "$2" |
tee >(xargs ps -aux >task.log) |
xargs ps -o cpu% |
awk '{sum += $1} END {print sum}'
)
echo "Total CPU Usage: $cpuusage" >> monitor2.log
sleep "$1"
done
ps -aux | grep ...
xargs
将pgrep
输给ps -o %cpu=
ps -o %cpu=
显示每个进程的CPU使用百分比awk
用于求和。monitor2.log
文件中。答案 1 :(得分:0)
我想你是在追求这样的东西:
ps aux | awk '$11 ~ /firefox/{ sum += $3 } END { print sum }'
awk
检查ps
产生的每一行的字段11,如果它包含firefox
,它将执行相关的{}
块。请注意,在不同的系统上,ps
的输出是不同的。
您想在watch
命令中运行它。例如。这样(注意如何避免使用awk变量引用地狱)。
ps-sum() { ps aux | awk -v regex=$1 '$11 ~ regex { sum += $3 } END { print sum }' ;}
export -f ps-sum
watch -x bash -c "ps-sum firefox"