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
相关产品推荐
相关产品推荐

