FreeBSD下如何提取CPU使用率百分比并赋值到变量?
在FreeBSD中获取CPU使用率并赋值给变量的几种方法
在FreeBSD上要把CPU使用率提取出来存到变量里?这几个方案我日常写脚本时经常用,每种都有适用场景,你可以按需挑选:
方法1:用top命令直接提取(直观易读)
top是大家最熟悉的系统监控工具,在FreeBSD里可以用批处理模式输出,再通过文本处理工具精准提取数值:
# 提取总CPU使用率并赋值给cpu_usage变量(去掉百分号,只留纯数字) cpu_usage=$(top -b -n 1 | awk '/^CPU:/ {print $2}' | sed 's/%//') # 验证变量内容 echo "当前CPU使用率:${cpu_usage}%"
细节说明:
top -b:启用批处理模式,不需要交互界面,完美适配脚本调用场景top -n 1:只输出一次统计结果,避免持续输出占用资源awk '/^CPU:/ {print $2}':匹配以CPU:开头的行,直接提取第二个字段(带百分号的使用率数值)sed 's/%//':去掉百分号,让变量里存的是纯数字,方便后续做算术运算
方法2:用vmstat计算(轻量高效,适合脚本)
如果觉得top资源占用偏高,vmstat是更轻量的选择,它输出的空闲CPU百分比可以直接用来反向计算使用率:
# 获取空闲CPU百分比(取第二次输出结果,避免初始值偏差) cpu_idle=$(vmstat 1 2 | tail -n 1 | awk '{print $13}') # 计算使用率并赋值(100%减去空闲率) cpu_usage=$((100 - cpu_idle)) # 打印结果 echo "当前CPU使用率:${cpu_usage}%"
细节说明:
vmstat 1 2:每隔1秒输出一次系统状态,共输出2次;取第二次结果是因为第一次输出多为系统启动以来的平均数值,不够实时awk '{print $13}':FreeBSD的vmstat输出中,第13列对应空闲CPU的百分比$((100 - cpu_idle)):用Shell内置的算术运算直接算出使用率,得到纯数字变量
方法3:通过sysctl底层统计计算(精准可靠)
如果需要最精准的CPU使用率统计,可以直接读取系统内核的CPU时间数据,通过比例计算得到使用率:
# 读取内核CPU时间统计数据,分别存入对应变量 read user nice system interrupt idle <<< $(sysctl -n kern.cp_time) # 计算总CPU时间(所有状态的时间总和) total_cpu_time=$((user + nice + system + interrupt + idle)) # 计算使用率((总时间-空闲时间)/总时间*100,保留整数) cpu_usage=$(( (total_cpu_time - idle) * 100 / total_cpu_time )) # 查看结果 echo "当前CPU使用率:${cpu_usage}%"
细节说明:
sysctl -n kern.cp_time:输出内核统计的CPU时间,包含5个数值:用户态时间、nice优先级进程时间、系统态时间、中断时间、空闲时间- 把这5个数值分别读入变量后,计算总时间,再通过比例算出使用率,这种方法直接从内核获取原始数据,准确性最高,适合长期监控的脚本
小拓展:实时监控
如果需要持续监控CPU使用率,可以把上述代码放到while循环里,比如:
while true; do cpu_usage=$(top -b -n 1 | awk '/^CPU:/ {print $2}' | sed 's/%//') echo "当前CPU使用率:${cpu_usage}%" sleep 5 done
内容的提问来源于stack exchange,提问作者Sebastián Alegría
相关产品推荐
相关产品推荐

