BASH如何获取与htop显示一致的各CPU核心使用率用于循环判断
实现方案
htop的CPU核心使用率是基于/proc/stat的两次采样差值计算得到的,我们用完全一致的逻辑实现,就能保证数值和htop显示完全对齐。
实现逻辑
读取/proc/stat下对应核心的累计CPU时间片数据,间隔1秒(和htop默认刷新间隔一致)采样两次,计算非空闲时间占总时间的比例,保留1位小数即可得到和htop完全一致的使用率。
完整可运行脚本
#!/bin/bash # 入参为核心序号(从0开始,cpu0对应第一个核心,cpu1对应第二个核心) get_cpu_core_usage() { local core_id=$1 # 第一次采样 local stat1=($(grep -w "cpu$core_id" /proc/stat)) sleep 1 # 第二次采样 local stat2=($(grep -w "cpu$core_id" /proc/stat)) # 计算两次采样的各状态时间差 local user=$(( ${stat2[1]} - ${stat1[1]} )) local nice=$(( ${stat2[2]} - ${stat1[2]} )) local system=$(( ${stat2[3]} - ${stat1[3]} )) local idle=$(( ${stat2[4]} - ${stat1[4]} )) local iowait=$(( ${stat2[5]} - ${stat1[5]} )) local irq=$(( ${stat2[6]} - ${stat1[6]} )) local softirq=$(( ${stat2[7]} - ${stat1[7]} )) local total=$(( user + nice + system + idle + iowait + irq + softirq )) local non_idle=$(( total - idle )) # 输出保留1位小数的使用率,和htop格式一致 [ $total -eq 0 ] && echo "0.0" || echo "scale=1; $non_idle * 100 / $total" | bc } # 主循环 while : do CPUcore1=$(get_cpu_core_usage 0) CPUcore2=$(get_cpu_core_usage 1) # 浮点数比较判断是否双核心都超过95% if (( $(echo "$CPUcore1 > 95" | bc -l) )) && (( $(echo "$CPUcore2 > 95" | bc -l) )); then # 此处填写你要执行的自定义脚本逻辑 : fi done
注意事项
- 脚本依赖
bc工具做数值计算,绝大多数Linux发行版默认预装,缺失可执行apt install bc或yum install bc安装。 - 如果需要调整刷新间隔,修改
get_cpu_core_usage函数里sleep后的数值即可,和htop刷新间隔保持一致的情况下数值完全无差异。 - 如果你需要用原生整数比较避免bc依赖,可以把计算逻辑调整为
scale=0; $non_idle * 1000 / $total得到扩大10倍的整数(95%对应950),直接用-gt做比较即可。
内容的提问来源于stack exchange,提问作者iTaMaR
相关产品推荐
相关产品推荐

