简介
以前使用宝塔的时候宝塔里面会有一个警告,可以用来配置网站检测,检测到网站掉线可以直接发送邮件通知
后面使用nginx面板后,没有这个功能了,但是我们可以使用脚本来实现,前提是我们的服务器配置了mailx,因为邮件发送时需要依靠这个服务的。
安装s-nail服务
为什么要安装这个服务呢,因为以前这个服务叫mailx,后面改名叫s-nail了
使用下面命令安装
yum -y install s-nail
我截图上使用的是dnf install -y s-nail,但是使用上面命令也是可以的
配置s-nail服务
s-nail配置文件分为全局和用户
在/etc/下面创建的文件为全局文件
在当前用户目录下创建的文件为当前用户文件
s-nail会先读取全局配置文件,然后在读取用户文件
使用下面命令修改编辑默认的配置文件
vi /etc/s-nail.rc
我们不管默认的配置,直接把光标移动到最后面,然后把下面内容粘贴进去,然后保存退出
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
测试
使用下面命令发送一条测试邮件看看,如果正常发送,收邮件的邮箱也可以正常收到邮件即为正常
echo "测试邮件正文" | mail -s "测试标题" 239972420@qq.com
如果测试成立了,那么到这里邮件服务就安装完成了,接下来就需要使用脚本去定时检测网站,掉线了就发送邮件提醒了
创建网站检测脚本
脚本的路径自定义,例如我就是直接在root目录下创建的
vi /root/check_website.sh
然后粘贴下面内容进去,更具自己的需求修改用户配置区,然后保存
#!/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
使用下面命令授权可执行
chmod +x check_website.sh
创建定时器
进入system文件夹
cd /etc/systemd/system/
创建一个定时器
vi check_website.timer
然乎复制下面内容粘贴进去,根据自己需求改一下,然后保存
[Unit]
# 任务描述
Description=Timed detection www.ersansi.top
[Timer]
# 系统启动后多久执行第一次
OnBootSec=5min
# 任务间隔多久执行一次
OnUnitActiveSec=10min
# 定时器关联的服务单元名称
Unit=check_website.service
[Install]
WantedBy=timers.target
授权可执行
创建脚本服务
使用下面命令创建一个服务文件,注意命令最后的check_website.service一定和定时器上的服务单元名称一样
vi /etc/systemd/system/check_website.service
把下面内容粘贴进去,然后按需修改,然后保存退出
[Unit]
# 服务描述
Description=check_website Service
[Service]
Type=oneshot
# 脚本路径
ExecStart=/root/check_website.sh
授权可执行
chmod +x check_website.service
启动
重新加载 systemd 配置
systemctl daemon-reload
启用定时器开机自启
systemctl enable check_website.timer
立即启动定时器
systemctl start check_website.timer
查看定时器状态和下次触发时间
使用下面命令查看状态和出发时间
systemctl list-timers check_website.timer
脚本下载
如果不想自己创建脚本,可以到资源库复制脚本链接使用wget命令下载
也可以在此页下载完成后上传到服务器对应文件夹
网站检测脚本:【点击下载】
定时器:【点击下载】
服务文件:【点击下载】