#功能:计算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}]}",