You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 16:36:09