You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

需求:连续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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 03:20:51