比“服务器出故障”更可怕的是“没人知道出故障了”
作为一名站长或运维人员,你是否经历过这些:
- 半夜流量暴涨,PHP-FPM 崩了网站没人能访问;
- Nginx 进程因为配置错误被重启失败;
- 磁盘写满导致数据库崩坏;
- 服务宕机几小时才被“用户投诉”提醒…
而解决这些问题,并不需要什么高深AI运维平台。你完全可以写一个轻量、稳定、定时执行的“自愈脚本”,让服务器自己检查健康状况、自动修复服务、发出警报通知。
一、自愈系统的设计目标
你的目标不是“替代人”,而是“第一时间恢复核心功能”。
✅ 基本逻辑:
- 检测:定期检查关键服务/资源状态;
- 诊断:判断是否存在故障(宕机、高负载、端口阻塞、磁盘满等);
- 处理:执行服务重启、清理、告警、发送消息等操作;
- 记录:写日志,便于你事后查看;
- 通知:通过邮件/微信/Bark/push等方式提醒你;
二、典型自愈场景和响应策略
场景 | 自愈动作 |
---|---|
Nginx / PHP-FPM 进程挂掉 | 自动重启服务 |
MySQL 崩溃 / 无响应 | 判断进程状态并重启 |
CPU/内存占用异常 | kill 高占用进程并告警 |
磁盘空间 > 90% | 自动清理缓存/日志 |
网站端口无法访问 | 复位防火墙 + 重启服务 |
服务器无响应 10 分钟以上 | (备用)远程触发强制重启或DDNS切换 |
外部健康检查失败 | 通知管理员并切换备用节点 |
三、核心脚本逻辑:一份 Linux 自愈框架(Bash 版)
bash#!/bin/bash
LOG_FILE="/var/log/selfheal.log"
EMAIL="you@example.com"
log() {
echo "[$(date)] $1" >> $LOG_FILE
}
# 1. 检查 Nginx 是否运行
if ! pgrep -x "nginx" > /dev/null; then
log "Nginx crashed! Attempting restart..."
systemctl restart nginx
sleep 3
if pgrep -x "nginx" > /dev/null; then
log "Nginx restarted successfully."
else
log "Nginx restart failed. Sending alert."
echo "Nginx failed to restart on $(hostname)" | mail -s "Nginx Crash Alert" $EMAIL
fi
fi
# 2. 检查磁盘使用率
DISK_USAGE=$(df / | grep / | awk '{ print $5 }' | sed 's/%//g')
if [ $DISK_USAGE -gt 90 ]; then
log "Disk usage high: $DISK_USAGE%. Cleaning logs."
find /var/log -type f -name "*.log" -delete
log "Old logs deleted."
fi
# 3. 检查 MySQL 是否存活
if ! pgrep -x "mysqld" > /dev/null; then
log "MySQL crashed! Restarting..."
systemctl restart mysql
sleep 5
if ! pgrep -x "mysqld" > /dev/null; then
log "MySQL restart failed. Alerting admin."
echo "MySQL failed on $(hostname)" | mail -s "MySQL Crash" $EMAIL
else
log "MySQL restarted successfully."
fi
fi
四、部署方式:定时任务(Cron)+ Systemd 更稳
✅ 方法1:添加定时任务,每5分钟执行一次
bashcrontab -e
# 加入以下行
*/5 * * * * /usr/local/bin/selfheal.sh
✅ 方法2:Systemd 持续后台运行(推荐)
创建 systemd 服务:
ini# /etc/systemd/system/selfheal.service
[Unit]
Description=Linux Self-Healing Daemon
[Service]
ExecStart=/usr/local/bin/selfheal.sh
Restart=always
RestartSec=30
[Install]
WantedBy=multi-user.target
然后:
bashchmod +x /usr/local/bin/selfheal.sh
systemctl daemon-reexec
systemctl enable --now selfheal.service
五、进阶功能拓展建议
功能 | 实现方法 |
---|---|
Telegram 报警 | 使用 curl 发送 Bot 消息 |
微信推送 | 企业微信机器人 / Server酱 |
Bark 推送 | 手机推送(适合 iOS) |
Redis 检查 | redis-cli ping + 重启 |
防火墙复位 | iptables -F + 恢复规则 |
CDN刷新 | API 调用刷新缓存 |
备份失败提醒 | 定时 check tar.gz 或 rclone 状态码 |
六、实战建议和注意事项
✅ 分离逻辑与配置:将配置文件(邮件、端口、服务名等)写入 .env
或 conf.ini
,提高脚本可维护性。
✅ 设置限频:避免“自愈失败→无限循环重启”导致更大故障。
✅ 记录恢复时间:可用 Prometheus + Alertmanager + Grafana 可视化自愈触发记录。
✅ 多节点联动:高可用架构建议主从间监控互相状态,互为备用。
七、:你的服务器不该只会“等你修”
运维不是“出了问题再处理”,而是“在问题发生前就准备好应对”。
你没法 7×24 值班,但你可以让你的服务器,自带一点“生存本能”——自动识别、自动响应、自动告警、自我恢复。
这不只是技术力的提升,更是你运维哲学的一次升级。