CPU与内存监控脚本异常排查咨询:使用率显示错误及告警失效问题
CPU与内存监控脚本异常排查咨询:使用率显示错误及告警失效问题
嗨,我来帮你梳理下这个监控脚本的问题——你现在遇到了CPU使用率显示0%、告警逻辑没触发的情况,咱们一步步拆解解决:
一、CPU使用率计算的核心问题
你当前用的cpuUsage=$(top -bn1 | awk '/Cpu/ { print $2}')有两个常见坑:
- top输出格式不兼容:不同Linux发行版的
top输出字段差异很大,比如有些版本中Cpu行的第一个数值只是用户态使用率(%us),而非总使用率;还有的版本输出里数值带逗号(比如0.3,),直接取$2会得到带符号的无效数值。 - 匹配规则太局限:部分系统的
top输出是小写cpu开头,/Cpu/会匹配不到目标行,导致cpuUsage为空,最终显示0%。
修复方案
推荐用更稳定的方式计算CPU总使用率(通过空闲率反推):
# 方案1:兼容多数top版本 cpuUsage=$(top -bn1 | awk '/%[Cc]pu/ {print 100 - $8}') # 方案2:如果安装了mpstat,结果更准确(取1秒内的平均使用率) cpuUsage=$(mpstat 1 1 | awk '/Average/ {print 100 - $12}')
二、内存使用率的逻辑错误
你当前的memUsage=$(free -m | awk '/Mem/{print $3}')获取的是已用内存的MB绝对值,不是百分比!这根本没法用来判断是否超过70%阈值。
修复方案
改成计算内存使用率百分比(取整数方便后续判断):
memUsage=$(free | awk '/Mem/ {printf "%.0f", $3/$2*100}')
三、告警逻辑的语法错误
你写的if [ "$cpuUsage" -ge 70]; then有两个致命问题:
- 语法格式错误:
[是shell的测试命令,参数之间必须用空格分隔,70和]之间少了空格,会导致脚本报错中断。 - 整数比较不适用:CPU使用率通常是小数(比如68.5),用
-ge这种整数比较运算符会直接报错,没法触发告警。
修复方案
用bc工具做浮点比较,同时加上红色警告的ANSI转义码:
# CPU告警(浮点比较) if (( $(echo "$cpuUsage >= 70" | bc -l) )); then echo -e "\033[31mWARNING: CPU usage exceeds 70%! Current usage: $cpuUsage%\033[0m" fi # 内存告警(整数比较即可) if [ "$memUsage" -ge 70 ]; then echo -e "\033[31mWARNING: Memory usage exceeds 70%! Current usage: $memUsage%\033[0m" fi
完整修正后的脚本
#!/bin/bash # 获取CPU使用率(兼容多数系统) cpuUsage=$(top -bn1 | awk '/%[Cc]pu/ {print 100 - $8}') # 若系统安装了mpstat,可替换为更稳定的: # cpuUsage=$(mpstat 1 1 | awk '/Average/ {print 100 - $12}') # 获取内存使用率(百分比整数) memUsage=$(free | awk '/Mem/ {printf "%.0f", $3/$2*100}') # 输出当前使用率 echo "CPU Usage: $cpuUsage%" echo "Memory Usage: $memUsage%" # CPU告警逻辑(红色警告) if (( $(echo "$cpuUsage >= 70" | bc -l) )); then echo -e "\033[31mWARNING: CPU usage is above 70%! Current: $cpuUsage%\033[0m" fi # 内存告警逻辑(红色警告) if [ "$memUsage" -ge 70 ]; then echo -e "\033[31mWARNING: Memory usage is above 70%! Current: $memUsage%\033[0m" fi
备注:内容来源于stack exchange,提问作者linuxnoobie
相关产品推荐
相关产品推荐

