宝塔面板添加方法:
打开宝塔面板 → 左侧点击【计划任务】点击右上角【添加任务】
设置如下:
任务类型:Shell脚本
任务名称:监控MySQL和Nginx状态
执行周期:建议选择 每30分钟或是5分钟
脚本内容:
DATE=$(date "+%Y-%m-%d %H:%M:%S")
LOG_FILE="/www/wwwlogs/bt_service_monitor.log"
check_mysql() {
systemctl is-active --quiet mysqld
if [ $? -ne 0 ]; then
echo "$DATE [ERROR] MySQL 未运行,尝试重启..." >> "$LOG_FILE"
systemctl restart mysqld
sleep 2
systemctl is-active --quiet mysqld && \
echo "$DATE [INFO] MySQL 重启成功。" >> "$LOG_FILE" || \
echo "$DATE [FATAL] MySQL 重启失败!" >> "$LOG_FILE"
else
echo "$DATE [OK] MySQL 正常运行。" >> "$LOG_FILE"
fi
}
check_nginx() {
systemctl is-active --quiet nginx
if [ $? -ne 0 ]; then
echo "$DATE [ERROR] Nginx 未运行,尝试重启..." >> "$LOG_FILE"
systemctl restart nginx
sleep 2
systemctl is-active --quiet nginx && \
echo "$DATE [INFO] Nginx 重启成功。" >> "$LOG_FILE" || \
echo "$DATE [FATAL] Nginx 重启失败!" >> "$LOG_FILE"
else
echo "$DATE [OK] Nginx 正常运行。" >> "$LOG_FILE"
fi
}
check_mysql
check_nginx
注意事项:
日志路径 /www/wwwlogs/bt_service_monitor.log 是宝塔默认日志目录,确保该目录存在。也可以改成 /root/bt_monitor.log 等你喜欢的位置。如果你使用的是 CentOS 7/8、Ubuntu 16+ 等系统,默认使用的是 systemctl,这个脚本就能直接运行。
如果你是使用的 MariaDB 或者其他服务名,记得把 mysqld 改成实际服务名(比如 mariadb)。
升级版本:
#!/bin/bash
DATE=$(date "+%Y-%m-%d %H:%M:%S")
LOG_FILE="/www/wwwlogs/bt_service_monitor.log"
# ====== 通知开关(填上就启用) ======
# Server酱(https://sct.ftqq.com/sendkey)
SCKEY="你的Server酱SendKey"
# PushPlus(http://www.pushplus.plus/)
PUSHPLUS_TOKEN="你的PushPlus token"
# 钉钉机器人(群机器人 Webhook 地址)
DING_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=xxx"
# 企业微信机器人(Webhook 地址)
WECHAT_WEBHOOK="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx"
# ===================================
# 通用发送函数
notify_all() {
local msg="$1"
# Server酱
if [ -n "$SCKEY" ]; then
curl -s -X POST "https://sctapi.ftqq.com/${SCKEY}.send" \
-d "title=宝塔服务监控告警" \
-d "desp=${msg}" > /dev/null
fi
# PushPlus
if [ -n "$PUSHPLUS_TOKEN" ]; then
curl -s -X POST "http://www.pushplus.plus/send" \
-H "Content-Type: application/json" \
-d "{\"token\":\"${PUSHPLUS_TOKEN}\",\"title\":\"宝塔服务监控告警\",\"content\":\"${msg}\"}" > /dev/null
fi
# 钉钉机器人
if [ -n "$DING_WEBHOOK" ]; then
curl -s -X POST "${DING_WEBHOOK}" \
-H 'Content-Type: application/json' \
-d "{\"msgtype\": \"text\", \"text\": {\"content\": \"[宝塔服务监控告警] ${msg}\"}}" > /dev/null
fi
# 企业微信机器人
if [ -n "$WECHAT_WEBHOOK" ]; then
curl -s -X POST "${WECHAT_WEBHOOK}" \
-H 'Content-Type: application/json' \
-d "{\"msgtype\": \"text\", \"text\": {\"content\": \"[宝塔服务监控告警] ${msg}\"}}" > /dev/null
fi
}
# 检查服务并重启逻辑
check_service() {
local name="$1"
local service_name="$2"
local retry=0
while ! systemctl is-active --quiet "$service_name"; do
echo "$DATE [ERROR] $name 未运行,尝试重启(第 $((retry+1)) 次)..." >> "$LOG_FILE"
systemctl restart "$service_name"
sleep 2
((retry++))
if systemctl is-active --quiet "$service_name"; then
echo "$DATE [INFO] $name 重启成功。" >> "$LOG_FILE"
notify_all "$name 异常,但已成功重启。"
return
fi
if [ "$retry" -ge 3 ]; then
echo "$DATE [FATAL] $name 重启3次失败,准备重启服务器!" >> "$LOG_FILE"
notify_all "$name 重启3次失败,服务器即将重启!"
shutdown -r now
return
fi
done
echo "$DATE [OK] $name 正常运行。" >> "$LOG_FILE"
}
# 开始检测
check_service "MySQL" "mysqld"
check_service "Nginx" "nginx"
每5分钟检查 MySQL 和 Nginx 是否正常如果某个服务:
重启失败三次 → 自动重启整台服务器
支持钉钉或微信推送通知(通过Server酱、PushPlus等)
Server酱通知配置:
打开:https://sct.ftqq.com/login 登录或注册创建一个发送通道,获得一个 SendKey
替换脚本中的:PUSH_KEY="SCTxxxxxx"
通知平台快速注册说明:
平台 地址 获取方式
Server酱 https://sct.ftqq.com 登录 → 创建通道 → 拿 SendKey
PushPlus http://pushplus.plus 登录 → 个人中心 → Token
钉钉群机器人 群设置 → 智能群助手 → 添加机器人 获取 Webhook 地址
企业微信机器人 管理后台 → 应用 → 自建机器人 获取 Webhook 地址