简介

以前使用宝塔的时候宝塔里面会有一个警告,可以用来配置网站检测,检测到网站掉线可以直接发送邮件通知

后面使用nginx面板后,没有这个功能了,但是我们可以使用脚本来实现,前提是我们的服务器配置了mailx,因为邮件发送时需要依靠这个服务的。



安装s-nail服务

为什么要安装这个服务呢,因为以前这个服务叫mailx,后面改名叫s-nail了

使用下面命令安装

yum -y install s-nail

我截图上使用的是dnf install -y s-nail,但是使用上面命令也是可以的

8.png



配置s-nail服务

s-nail配置文件分为全局和用户

在/etc/下面创建的文件为全局文件

在当前用户目录下创建的文件为当前用户文件

s-nail会先读取全局配置文件,然后在读取用户文件

使用下面命令修改编辑默认的配置文件

vi /etc/s-nail.rc

9.png

我们不管默认的配置,直接把光标移动到最后面,然后把下面内容粘贴进去,然后保存退出

set from="发件人名称(可以中文 <邮箱地址>"
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=你的QQ邮箱@qq.com
set smtp-auth-password=你的授权码
set smtp-auth=login
set ssl-verify=ignore
set mta-smtp

12.png



测试

使用下面命令发送一条测试邮件看看,如果正常发送,收邮件的邮箱也可以正常收到邮件即为正常

echo "测试邮件正文" | mail -s "测试标题" 239972420@qq.com

11.png

如果测试成立了,那么到这里邮件服务就安装完成了,接下来就需要使用脚本去定时检测网站,掉线了就发送邮件提醒了



创建网站检测脚本

脚本的路径自定义,例如我就是直接在root目录下创建的

vi /root/check_website.sh

13.png

然后粘贴下面内容进去,更具自己的需求修改用户配置区,然后保存

#!/bin/bash

########## 用户配置区 ##########

URL="https://example.com"                 # 需要监控的网址
TO_EMAIL="recipient@example.com"          # 收件人邮箱,多人用逗号分隔
MAX_RETRIES=3                             # 单次检测最大重试次数
RETRY_INTERVAL=2                         # 重试间隔(秒)
ALERT_THRESHOLD=2                        # 连续异常次数达到该值时报警
ALERT_COOLDOWN=3600                      # 报警冷却时间(秒)
LOGFILE="/var/log/website_monitor.log"  # 日志文件路径
STATUS_FILE="/tmp/website_monitor_status"  # 用于存储连续异常次数
LAST_ALERT_FILE="/tmp/website_monitor_last_alert"  # 上次报警时间记录文件
ENABLE_RECOVERY_EMAIL="yes"               # 是否开启恢复邮件通知,yes开启,no关闭

########## 脚本主体 ##########

log() {
  echo "$(date '+%Y-%m-%d %H:%M:%S') $1" >> "$LOGFILE"
}

check_website() {
  local attempt=1
  while [ $attempt -le $MAX_RETRIES ]; do
    http_code=$(curl -s -o /dev/null -w "%{http_code}" -m 10 "$URL")
    if [ "$http_code" == "200" ]; then
      return 0
    else
      log "第 $attempt 次检测:网站返回状态码 $http_code,URL:$URL"
      ((attempt++))
      sleep $RETRY_INTERVAL
    fi
  done
  return 1
}

send_alert() {
  local now=$(date +%s)
  local last_alert=0

  if [ -f "$LAST_ALERT_FILE" ]; then
    last_alert=$(cat "$LAST_ALERT_FILE")
  fi

  if (( now - last_alert < ALERT_COOLDOWN )); then
    log "报警冷却中,跳过本次报警。"
    return
  fi

  local subject="【网站监控报警】$URL 连续异常"
  local body="监控系统检测到网站 $URL 连续异常超过阈值 $ALERT_THRESHOLD 次。\n请尽快检查!\n时间:$(date)"

  echo -e "$body" | mail -s "$subject" $TO_EMAIL
  echo "$now" > "$LAST_ALERT_FILE"
  log "发送报警邮件至:$TO_EMAIL"
}

send_recovery() {
  if [ "$ENABLE_RECOVERY_EMAIL" != "yes" ]; then
    log "恢复邮件通知被关闭,跳过发送恢复邮件。"
    return
  fi

  local subject="【网站监控恢复】$URL 已恢复正常"
  local body="监控系统检测到网站 $URL 已恢复正常。\n时间:$(date)"

  echo -e "$body" | mail -s "$subject" $TO_EMAIL
  log "发送恢复通知邮件至:$TO_EMAIL"
}

main() {
  check_website
  current_status=$?  # 0=正常, 1=异常

  # 读取上次状态,默认正常(0)
  if [ -f "$STATUS_FILE" ]; then
    last_status=$(cat "$STATUS_FILE")
  else
    last_status=0
  fi

  if [ $current_status -eq 0 ]; then
    # 网站正常
    echo 0 > "$STATUS_FILE"

    if [ $last_status -ne 0 ]; then
      # 状态从异常变正常,发送恢复邮件
      send_recovery
    fi

    log "网站正常。"
  else
    # 网站异常
    local fail_count=0
    if [ -f "$STATUS_FILE" ]; then
      fail_count=$(cat "$STATUS_FILE")
    fi

    ((fail_count++))
    echo "$fail_count" > "$STATUS_FILE"
    log "网站异常,连续异常次数:$fail_count"

    if (( fail_count >= ALERT_THRESHOLD )); then
      send_alert
    fi
  fi
}

main

14.png

使用下面命令授权可执行

chmod +x check_website.sh

15.png



创建定时器

进入system文件夹

cd /etc/systemd/system/

16.png

创建一个定时器

vi check_website.timer

17.png

然乎复制下面内容粘贴进去,根据自己需求改一下,然后保存

[Unit]
# 任务描述
Description=Timed detection www.ersansi.top

[Timer]
# 系统启动后多久执行第一次
OnBootSec=5min
# 任务间隔多久执行一次
OnUnitActiveSec=10min
# 定时器关联的服务单元名称
Unit=check_website.service

[Install]
WantedBy=timers.target

20.png

授权可执行

19.png



创建脚本服务

使用下面命令创建一个服务文件,注意命令最后的check_website.service一定和定时器上的服务单元名称一样

vi /etc/systemd/system/check_website.service

21.png

把下面内容粘贴进去,然后按需修改,然后保存退出

[Unit]
# 服务描述
Description=check_website Service

[Service]
Type=oneshot
# 脚本路径
ExecStart=/root/check_website.sh

22.png

授权可执行

chmod +x check_website.service

23.png



启动

重新加载 systemd 配置

systemctl daemon-reload

启用定时器开机自启

systemctl enable check_website.timer

立即启动定时器

systemctl start check_website.timer

24.png



查看定时器状态和下次触发时间

使用下面命令查看状态和出发时间

systemctl list-timers check_website.timer

25.png



脚本下载

如果不想自己创建脚本,可以到资源库复制脚本链接使用wget命令下载

也可以在此页下载完成后上传到服务器对应文件夹

网站检测脚本:【点击下载

定时器:【点击下载

服务文件:【点击下载

二维码

发表评论