Linux中无原生watch-g命令,可用watch结合/proc/loadavg与bc浮点比较实现负载超阈值报警并退出,或封装为可传参的独立脚本check-load-alert.sh,支持灵活配置、stderr日志及后续扩展。

Linux 中没有原生的 watch-g 命令,你可能是想用 watch 结合系统负载检测(如 uptime、cat /proc/loadavg)来实现“当负载超过阈值时运行报警脚本并退出”。下面给出一个轻量、可靠、可直接运行的方案。
用 watch + shell 判断实现负载监控与触发
watch 本身不支持条件退出或执行外部命令,但可以通过它反复执行一段 shell 逻辑来达成目标。核心思路是:每次检查负载,超阈值则运行报警脚本并用 exit 终止整个 watch 进程。
示例:当 1 分钟平均负载 ≥ 4.0 时,执行 /path/to/alert.sh 并退出监控:
watch -n 5 'load=$(awk "{print \$1}" /proc/loadavg); if (( $(echo "$load >= 4.0" | bc -l) )); then /path/to/alert.sh; echo "Load threshold exceeded: $load"; exit 0; else echo "Current load: $load"; fi'说明:
-
-n 5表示每 5 秒检查一次;可根据需要调整 -
/proc/loadavg的第一列即为 1 分钟平均负载,精度高且无额外开销 -
bc -l用于浮点比较(bash原生不支持小数比较) -
exit 0会让watch停止刷新并返回终端 —— 这就是“自动退出”的关键
更健壮的写法:封装成独立监控脚本
把逻辑移入脚本更易维护、调试和复用。例如创建 check-load-alert.sh:
#!/bin/bash
THRESHOLD=${1:-4.0}
ALERT_SCRIPT=${2:-/path/to/alert.sh}
<p>while true; do
load=$(awk '{print $1}' /proc/loadavg)
if (( $(echo "$load >= $THRESHOLD" | bc -l) )); then
echo "ALERT: Load $load >= $THRESHOLD at $(date)" >&2
"$ALERT_SCRIPT" "$load" "$THRESHOLD"
exit 0
fi
sleep 5
done赋予执行权限后运行:
chmod +x check-load-alert.sh ./check-load-alert.sh 4.0 /opt/scripts/load-alert.sh
优点:
- 支持传参,灵活设置阈值和报警脚本路径
- 日志输出到 stderr,不影响主流程
- 避免
watch的 shell 解析陷阱(如引号嵌套、变量扩展问题) - 便于加入日志记录、多次重试、抑制重复告警等增强逻辑
报警脚本(alert.sh)建议内容
你的 alert.sh 可以简单发送通知,例如:
#!/bin/bash
LOAD=$1
THRESHOLD=$2
echo "? High system load: $LOAD (threshold: $THRESHOLD)" | mail -s "LOAD ALERT on $(hostname)" admin@example.com
# 或调用 curl 发送到企业微信/钉钉机器人
# curl -X POST -H 'Content-Type: application/json' -d '{"msgtype":"text","text":{"content":"Load $LOAD > $THRESHOLD"}}' https://qyapi.weixin.qq.com/...注意:
- 确保
mail或curl已安装且网络可达 - 脚本开头加
#!/bin/bash,并用chmod +x赋权 - 如需防止重复报警,可在脚本中加锁文件或时间窗口判断
替代方案:用 systemd timer 或 cron 实现长期值守
如果希望服务化、开机自启、崩溃自恢复,不推荐依赖交互式 watch。可用:
- systemd service + timer:将上述脚本设为一次性服务,用 timer 每 5 秒触发,超阈值后停用 timer
-
cron + flock:每分钟运行一次,用
flock防止并发,并在报警后写标记退出后续执行 -
专业工具:如
monit、zabbix-agent或prometheus + node_exporter + alertmanager,适合生产环境
对轻量场景,shell 脚本方案已足够;对稳定性要求高的系统,建议过渡到 monit 或 systemd 方案。


















