需求:连续5次Ping目标IP/网站不可达后执行指定脚本
修改Ping检测脚本实现连续5次失败才告警
下面是修改后的脚本,解决单次Ping误报问题,仅当目标连续5次检测不可达时触发Telegram告警:
#!/bin/bash # 失败计数存储目录,用来记录每个目标的连续失败次数 FAIL_COUNT_DIR="/home/user/ping_fail_counts" # 告警日志文件 ALERT_LOG="/home/user/siteDown.log" # 触发告警的连续失败阈值 FAIL_THRESHOLD=5 # 创建计数目录(不存在则自动创建) mkdir -p "$FAIL_COUNT_DIR" # 读取目标列表文件,逐个处理 while read -r output; do # 跳过空行 [ -z "$output" ] && continue # 将目标地址中的特殊字符替换为下划线,避免文件名非法 SAFE_OUTPUT=$(echo "$output" | tr '.' '_' | tr '/' '_') COUNT_FILE="$FAIL_COUNT_DIR/$SAFE_OUTPUT" # 执行1次Ping检测,屏蔽输出 ping -c 1 "$output" > /dev/null 2>&1 PING_EXIT_CODE=$? if [ $PING_EXIT_CODE -eq 0 ]; then # Ping成功:重置该目标的失败计数(删除计数文件) [ -f "$COUNT_FILE" ] && rm "$COUNT_FILE" else # Ping失败:读取当前失败次数,文件不存在则默认0 CURRENT_COUNT=$(cat "$COUNT_FILE" 2>/dev/null || echo 0) NEW_COUNT=$((CURRENT_COUNT + 1)) # 更新失败计数到文件 echo "$NEW_COUNT" > "$COUNT_FILE" # 达到阈值时触发告警 if [ $NEW_COUNT -eq $FAIL_THRESHOLD ]; then ALERT_MSG="$(date) - 节点 $output 不可达(连续$FAIL_THRESHOLD次Ping失败)" echo "$ALERT_MSG" >> "$ALERT_LOG" telegram-send "$ALERT_MSG" elif [ $NEW_COUNT -gt $FAIL_THRESHOLD ]; then # 超过阈值后不再重复发送告警(需要重复告警可删除此段) continue fi fi done < /home/user/list.txt
关键修改说明
- 持久化失败计数:通过独立的目录和文件记录每个目标的连续失败次数,避免脚本每次执行时丢失状态。
- 特殊字符处理:将目标地址中的
.、/等特殊字符替换为下划线,确保计数文件名合法。 - 告警逻辑控制:只有当连续失败次数刚好达到5次时发送告警,超过5次后不再重复发送(可根据需求移除重复告警限制)。
- 空行过滤:自动跳过目标列表中的空行,避免无效检测。
内容的提问来源于stack exchange,提问作者Samir Ahmadli
相关产品推荐
相关产品推荐

