如何让你的Linux服务器自动自救?一份自愈脚本指南

比“服务器出故障”更可怕的是“没人知道出故障了”

作为一名站长或运维人员,你是否经历过这些:

  • 半夜流量暴涨,PHP-FPM 崩了网站没人能访问
  • Nginx 进程因为配置错误被重启失败;
  • 磁盘写满导致数据库崩坏;
  • 服务宕机几小时才被“用户投诉”提醒…

而解决这些问题,并不需要什么高深AI运维平台。你完全可以写一个轻量、稳定、定时执行的“自愈脚本”,让服务器自己检查健康状况、自动修复服务、发出警报通知。


一、自愈系统的设计目标

你的目标不是“替代人”,而是“第一时间恢复核心功能”。

✅ 基本逻辑:

  1. 检测:定期检查关键服务/资源状态;
  2. 诊断:判断是否存在故障(宕机、高负载、端口阻塞、磁盘满等);
  3. 处理:执行服务重启、清理、告警、发送消息等操作;
  4. 记录:写日志,便于你事后查看;
  5. 通知:通过邮件/微信/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分钟执行一次

bash
crontab -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

然后:

bash
chmod +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 状态码

六、实战建议和注意事项

分离逻辑与配置:将配置文件(邮件、端口、服务名等)写入 .envconf.ini,提高脚本可维护性。

设置限频:避免“自愈失败→无限循环重启”导致更大故障。

记录恢复时间:可用 Prometheus + Alertmanager + Grafana 可视化自愈触发记录。

多节点联动:高可用架构建议主从间监控互相状态,互为备用。


七、:你的服务器不该只会“等你修”

运维不是“出了问题再处理”,而是“在问题发生前就准备好应对”。

你没法 7×24 值班,但你可以让你的服务器,自带一点“生存本能”——自动识别、自动响应、自动告警、自我恢复。

这不只是技术力的提升,更是你运维哲学的一次升级。

实操指南行业资讯

WordPress建站到底选轻量云还是传统VPS?全维度实测与决策指南

2025-3-25 11:14:47

实操指南

一台服务器部署多个网站的最佳实践:Nginx多站配置实战指南

2025-3-27 12:07:27

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧