Shell脚本监控丢包并自动报警的核心是持续ping、解析丢包率、达阈值发通知;支持多目标探测、bc浮点比较、空值防护、日志记录及crontab定时执行,并可选mtr定位丢包环节。

用 Shell 脚本监控丢包并自动报警,核心是:持续 ping + 解析丢包率 + 达阈值发通知。不依赖复杂平台,轻量、可控、可快速上线。
明确监控目标和触发条件
先想清楚几个关键点,避免脚本“测了等于没测”:
- 监控哪些地址?建议选关键网关、上游 DNS(如 8.8.8.8)、核心业务服务器 IP 或域名;不要一次加几十个,优先保重点
- 丢包率阈值设多少?生产环境通常设 5%~10%,测试环境可更低;注意:单次 ping 的“瞬时丢包”易误报,必须靠多次探测取平均
- 报警方式怎么选?邮件最通用(需提前配好 mail 或 mutt),也可集成企业微信/钉钉 Webhook,但脚本里只需调一条 curl 命令
写一个健壮的丢包检测脚本
下面是一个经过验证的简化版,支持多目标、防误报、带日志:
#!/bin/bash
LOG_DIR="/var/log/ping-monitor"
mkdir -p $LOG_DIR
HOSTS=("8.8.8.8" "192.168.1.1")
THRESHOLD=5 # 丢包率上限,单位 %
for host in "${HOSTS[@]}"; do
# 执行 20 次 ping,提取丢包百分比(兼容不同系统输出)
loss=$(ping -c 20 "$host" 2>/dev/null | grep "packet loss" | awk -F', ' '{print }' | awk '{print }' | sed 's/%//')
if [[ -z "$loss" ]]; then
echo "$(date): $host unreachable or ping failed" >> "$LOG_DIR/error.log"
continue
fi
if (( $(echo "$loss > $THRESHOLD" | bc -l) )); then
msg="ALERT: $host packet loss = ${loss}% at $(date)"
echo "$msg" >> "$LOG_DIR/alarm.log"
echo "$msg" | mail -s "PING ALERT" admin@example.com
fi
done
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
说明:
• 使用 bc 做浮点比较(因丢包率可能是 3.5%);
• 丢包率提取适配常见 Linux 发行版(含 CentOS、Ubuntu、Debian);
• 加了空值判断,防止 ping 失败导致脚本中断或误判。
让脚本定时运行并保障可靠性
仅写完脚本不够,得让它真正“站岗”:
- 保存为 /usr/local/bin/check-ping.sh,加执行权限:
chmod +x /usr/local/bin/check-ping.sh - 加入 crontab,每 5 分钟跑一次:
*/5 * * * * /usr/local/bin/check-ping.sh - 加简单锁机制防并发(尤其在慢网络下 ping 耗时长):
开头加[ -f /tmp/.ping_check_lock ] && exit; touch /tmp/.ping_check_lock,结尾加rm -f /tmp/.ping_check_lock - 记录标准输出和错误到日志:
*/5 * * * * /usr/local/bin/check-ping.sh >> /var/log/ping-monitor/run.log 2>&1
进阶:配合 mtr 定位丢包环节
单纯知道“丢包了”不够,要快速区分是本地问题、中间链路还是目标异常:
- 当丢包率超阈值时,自动补跑一次 mtr(需安装:
yum install mtr -y或apt install mtr-tiny):mtr --report-wide -c 10 "$host" > "/var/log/ping-monitor/mtr-$(date +%s)-$host.txt" - 把 mtr 结果也附在报警邮件里,或只发摘要(如第 3 跳丢包率达 60%)
- 注意:mtr 会稍慢,建议只在告警触发时执行,不作为常规轮询项

















