shell获取CPU使用量

  
  
#功能:计算CPU的利用率,选取采样点
#计算公式:
#方法1:cpu usage=(idle2-idle1)/(cpu2-cpu1)*100
#方法2: cpu usage=[(user_2 +sys_2+nice_2) - (user_1 + sys_1+nice_1)]/(total_2 - total_1)*100
#方法3:(本脚本采用)
#total_0=USER[0]+NICE[0]+SYSTEM[0]+IDLE[0]+IOWAIT[0]+IRQ[0]+SOFTIRQ[0]
#total_1=USER[1]+NICE[1]+SYSTEM[1]+IDLE[1]+IOWAIT[1]+IRQ[1]+SOFTIRQ[1]
#cpu usage=(IDLE[0]-IDLE[1]) / (total_0-total_1) * 100
  
##echo user nice system idle iowait irq softirq
CPULOG_1=$(awk '/\<cpu\>/{print $2" "$3" "$4" "$5" "$6" "$7" "$8}' /proc/stat)
SYS_IDLE_1=$(echo $CPULOG_1 | awk '{print $4}')
Total_1=$(echo $CPULOG_1 | awk '{print $1+$2+$3+$4+$5+$6+$7}')
 
sleep 5
 
CPULOG_2=$(awk '/\<cpu\>/{print $2" "$3" "$4" "$5" "$6" "$7" "$8}' /proc/stat)
SYS_IDLE_2=$(echo $CPULOG_2 | awk '{print $4}')
Total_2=$(echo $CPULOG_2 | awk '{print $1+$2+$3+$4+$5+$6+$7}')
 
SYS_IDLE=`expr $SYS_IDLE_2 - $SYS_IDLE_1`
 
Total=`expr $Total_2 - $Total_1`
 
#method 1
#SYS_USAGE=`expr $SYS_IDLE/$Total*100 |bc -l`
#SYS_Rate=`expr 100-$SYS_USAGE |bc -l`
 
#method2
tmp_rate=`expr 1-$SYS_IDLE/$Total | bc -l`
SYS_Rate=`expr $tmp_rate*100 | bc -l`
 
#display
Disp_SYS_Rate=`expr "scale=3; $SYS_Rate/1" |bc`
echo $Disp_SYS_Rate%




这里面采用的方法是间隔5秒钟读取/proc/stat文件,并且通过计算两者之间的差值来确定CPU的使用量。这种计算方法不准确,因为这种线性的数值就得实时动态的去获取,但是本脚本采用的方法是只获取前后5秒的数值采样,计算差值,这里面的误差一定很大,本文只是通过这个脚本了解一下获取CPU资源的过程。


方式二:

#!/bin/bash

interval=1
cpu_num=`cat /proc/stat | grep cpu[0-9] -c`
for((i=0;i<${cpu_num};i++))
{
    start=$(cat /proc/stat | grep "cpu$i" | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}')
    start_idle[$i]=$(echo ${start} | awk '{print $4}')
    start_total[$i]=$(echo ${start} | awk '{printf "%.f",$1+$2+$3+$4+$5+$6+$7}')
}
start=$(cat /proc/stat | grep "cpu " | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}')
start_idle[${cpu_num}]=$(echo ${start} | awk '{print $4}')
start_total[${cpu_num}]=$(echo ${start} | awk '{printf "%.f",$1+$2+$3+$4+$5+$6+$7}')
sleep ${interval}
for((i=0;i<${cpu_num};i++))
{
    end=$(cat /proc/stat | grep "cpu$i" | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}')
    end_idle=$(echo ${end} | awk '{print $4}')
    end_total=$(echo ${end} | awk '{printf "%.f",$1+$2+$3+$4+$5+$6+$7}')
    idle=`expr ${end_idle} - ${start_idle[$i]}`
    total=`expr ${end_total} - ${start_total[$i]}`
    idle_normal=`expr ${idle} \* 100`
    cpu_usage=`expr ${idle_normal} / ${total}`
    cpu_rate[$i]=`expr 100 - ${cpu_usage}`  
}
end=$(cat /proc/stat | grep "cpu " | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}')
end_idle=$(echo ${end} | awk '{print $4}')
end_total=$(echo ${end} | awk '{printf "%.f",$1+$2+$3+$4+$5+$6+$7}')
idle=`expr ${end_idle} - ${start_idle[$i]}`
total=`expr ${end_total} - ${start_total[$i]}`
idle_normal=`expr ${idle} \* 100`
cpu_usage=`expr ${idle_normal} / ${total}`
cpu_rate[${cpu_num}]=`expr 100 - ${cpu_usage}`


echo "cpu_num" : ${cpu_num},
echo "cpu_used" : "${cpu_rate[${cpu_num}]}",

猜你喜欢

转载自blog.csdn.net/kongshuai19900505/article/details/79286738