Watch-G 本身不支持负载阈值自动退出,需用 shell 脚本实现:方法一用 watch -g 检测输出字符串变化(如整数跳变);方法二用 while 循环+bc 浮点比较精准判断;方法三封装为带参数的可复用脚本;推荐用 /proc/loadavg 替代 uptime 提升效率。

Watch-G 本身不支持“检测到负载变化就自动退出”的逻辑,它只是一个周期性执行命令并刷新显示的工具。要实现“负载达到阈值时自动退出监控”,需要借助 shell 脚本配合 watch 的退出机制(如 `-g` 选项)或更灵活的方式——用循环 + 条件判断 + break 控制。
方法一:用 watch -g 检测输出变化(适合简单触发)
watch -g 会在被监控命令的输出**发生改变时退出**(返回码为 1),但它不是按“数值大小”判断,而是按“字符串是否变化”。所以可把负载值格式化成唯一、易变的字符串(比如只取 uptime 中的 1 分钟负载,并四舍五入到整数):
watch -g -n 2 'echo $(uptime | awk -F"load average: " "{print \$2}" | awk -F", " "{printf \"%.0f\", \$1}")'
⚠️ 注意:这只能在负载值从一个整数跳到另一个整数时触发退出(例如从 2 变成 3),不能设定“>5 就停”。适用场景有限。
方法二:用 while 循环 + 条件判断(推荐,精准可控)
这是最常用也最可靠的方式:手动轮询负载,用 awk 提取数值,用 if 判断是否超限,满足即 break 并退出循环。
while true; do
load=$(uptime | awk -F'load average: ' '{print $2}' | awk -F', ' '{print $1}' | sed 's/^[[:space:]]*//')
echo "当前 1 分钟负载: $load"
if (( $(echo "$load > 5.0" | bc -l) )); then
echo "⚠️ 负载超过 5.0,停止监控"
break
fi
sleep 2
done
-
关键点:用
bc -l支持浮点比较(bash原生不支持小数比较) -
提取负载:
uptime输出中“load average: X, Y, Z”后的第一个值是 1 分钟平均负载 -
可调参数:把
5.0换成你需要的阈值,sleep 2可改为 1 或 5 秒
方法三:封装成可复用的脚本(带参数和提示)
保存为 watch-load.sh,赋予执行权限后可直接调用:
#!/bin/bash
THRESHOLD=${1:-3.0}
INTERVAL=${2:-3}
echo "⏳ 开始监控 1 分钟负载(阈值: $THRESHOLD,间隔: ${INTERVAL}s)..."
while true; do
load=$(uptime | awk -F'load average: ' '{print $2}' | awk -F', ' '{print $1}' | xargs)
printf "? %.2f " "$load"
if (( $(echo "$load >= $THRESHOLD" | bc -l) )); then
echo -e "\n✅ 触发阈值,退出监控"
exit 0
fi
sleep "$INTERVAL"
done
使用方式:./watch-load.sh 4.5 1(阈值 4.5,每秒检查一次)
补充说明:为什么不用 top / htop / glances?
这些是交互式监控工具,不适合“自动触发退出”;而 cat /proc/loadavg 虽然更轻量,但它的第一列也是 1 分钟平均负载,可替代 uptime:
load=$(awk '{print $1}' /proc/loadavg)
结果更干净,无解析开销,推荐在脚本中优先使用。











