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

Linux系统检测网站上下线 实现单次状态切换邮件告警

网站存活检测防重复告警脚本修改方案

核心实现逻辑

要解决重复发告警的问题,核心是把每次检测的状态持久化存储,避免脚本单次执行结束后丢失历史状态。每次运行检测时,将当前网站状态和上一次存储的状态做比对,仅在状态发生跳变时发送对应通知,发送完成后更新状态记录;状态无变化时直接退出,不触发任何告警,从根源避免重复发信:

  • 网站从正常切换为宕机:发送1次宕机告警
  • 网站从宕机切换为正常:发送1次恢复通知
  • 状态和上一次检测结果一致:直接退出,不做通知操作

修改后的完整脚本

#!/usr/bin/bash
# 基础配置,按需修改
MYHOST="https://www.testwebsite.com"
ALERT_RECV_MAIL="your-alert-mail@example.com"
# 状态标记文件,用于存储上一次检测的网站状态,不要放在/tmp目录避免被系统自动清理
STATUS_FILE="/var/tmp/website_monitor.last_status"
# 检测超时时间、重试次数,避免偶发网络抖动导致误判
CHECK_TIMEOUT=10
CHECK_RETRIES=2

# 首次运行初始化,状态文件不存在时默认标记为未知状态
if [ ! -f "$STATUS_FILE" ]; then
    echo "unknown" > "$STATUS_FILE"
fi
# 读取上一次记录的状态
LAST_STATUS=$(cat "$STATUS_FILE")

# 检测当前网站状态
CURRENT_STATUS="down"
# 用wget的spider模式仅拉取响应头,不下载完整页面,减少资源消耗
if wget --spider --timeout=$CHECK_TIMEOUT --tries=$CHECK_RETRIES -S "$MYHOST" 2>&1 | grep -wE "200|301|302" > /dev/null
then
    CURRENT_STATUS="up"
fi

# 仅当状态发生变化时触发邮件通知
if [ "$CURRENT_STATUS" != "$LAST_STATUS" ]; then
    if [ "$CURRENT_STATUS" = "down" ]; then
        # 发送宕机告警
        echo "网站 $MYHOST 当前无法访问,检测时间:$(date '+%Y-%m-%d %H:%M:%S')" | mailx -s "【告警】网站服务宕机" "$ALERT_RECV_MAIL"
    else
        # 发送恢复通知
        echo "网站 $MYHOST 已恢复正常访问,恢复时间:$(date '+%Y-%m-%d %H:%M:%S')" | mailx -s "【通知】网站服务已恢复" "$ALERT_RECV_MAIL"
    fi
    # 通知发送完成后更新状态记录
    echo "$CURRENT_STATUS" > "$STATUS_FILE"
fi

部署注意事项

  • 提前将脚本中MYHOST、ALERT_RECV_MAIL替换为实际需要检测的网站地址、告警接收邮箱
  • 提前配置好服务器的mailx发信环境,确保脚本可以正常调用mailx发送邮件
  • 将脚本加入crontab定时任务定期执行,可根据告警灵敏度需求调整执行频率,比如每1分钟检测一次的crontab配置示例:
    * * * * * /bin/bash /path/to/your/monitor_script.sh > /dev/null 2>&1
    
  • 如果业务场景下其他状态码也算服务正常(比如307跳转、401需要鉴权的场景),直接在grep的匹配规则中追加对应状态码即可
  • 不要将状态文件存放在/tmp目录,多数Linux发行版会定期清理/tmp下的文件,会导致状态记录丢失,触发重复告警。

内容的提问来源于stack exchange,提问作者Virally

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:12:22