使用shell脚本获取虚拟机中cpu使用率(读/proc/stat)

本文介绍了一个使用Bash脚本监控Linux系统CPU使用率的方法。该脚本通过读取/proc/stat文件来获取CPU状态信息,并计算出各CPU核心及平均的使用率。脚本还具备将监控数据保存到CSV文件的功能,方便后续的数据分析。
#!/bin/bash
interval=3
cpu_num=`cat /proc/stat | grep cpu[0-9] -c`

start_idle=()
start_total=()
cpu_rate=()

cpu_rate_file=./`hostname`_cpu_rate.csv
if [ -f ${cpu_rate_file} ]; then
    mv ${cpu_rate_file} ${cpu_rate_file}.`date +%m_%d-%H_%M_%S`.bak
fi
for((i=0;i<${cpu_num};i++))
{
    echo -n "cpu$i," >> ${cpu_rate_file}
}
echo -n "cpu_avg" >> ${cpu_rate_file}
echo "" >> ${cpu_rate_file}

while(true)
do
    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}`
        echo "The CPU$i Rate : ${cpu_rate[$i]}%"
        echo -n "${cpu_rate[$i]}," >> ${cpu_rate_file}
    }
    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 "The Average CPU Rate : ${cpu_rate[${cpu_num}]}%"
    echo -n "${cpu_rate[${cpu_num}]}" >> ${cpu_rate_file}
    echo "------------------"
    echo "" >> ${cpu_rate_file}
done

在Linux系统中,`/proc/stat`文件包含了系统的CPU状态信息,包括每个内核线程(任务)的运行时间、等待时间等。为了计算四个CPU核心的占用率,我们可以编写一个简单的shell脚本来解析这个文件。以下是一个基本示例: ```bash #!/bin/bash # 获取当前时间戳(用于计算间隔) last_time=$(date +%s) # 遍历CPU核心数(假设我们有4个核心) for ((i=0; i<4; i++)); do # 计算CPU $i的核心占用率(user + nice) cpu_usage_i=$(awk -v n=$i '{if ($7 == "n") {print n,"user"} else if ($8 == "n") {print n,"nice"} else print n,$7}' /proc/stat | awk 'END{print $1}') # 如果上一次取的时间存在,则计算周期内的平均使用率 if [ -n "$last_time" ]; then # 计算周期(秒) cycle=$(( $(date +%s) - last_time )) # 每秒钟计算一次使用率,避免瞬间波动影响平均值 if [ $cycle -gt 1 ]; then cpu_usage_rate_i=$(echo "scale=2; $cpu_usage_i / $cycle" | bc) echo "Core $i CPU Usage (last 1 second): ${cpu_usage_rate_i}%" fi fi # 保存当前时间 last_time=$(date +%s) done ``` 这个脚本首先获取当前时间,然后遍历四个CPU核心,通过`awk`命令分别计算用户时间和Nice时间(它们相加通常代表了CPU繁忙程度)。如果上次有记录,它会计算过去一秒的平均使用率并打印出来。 注意:实时CPU使用率可能会受到进程调度的影响,并非完全准确,尤其是在高负载下。如果你需要更精确的数据,可以考虑使用专门的性能监控工具如`top`、`mpstat`或第三方库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值