独立服务器定时重启维护脚本

脚本用于在独立服务器上自动执行定时重启维护任务,支持配置重启时间、前置检查(如服务状态、磁盘空间)及后置清理操作,采用 cron 定时触发,结合 Shell 脚本实现平滑重启、日志归档和异常告警,确保系统稳定性与可维护性,适用于需定期维护生产环境

轻量高效:为独立服务器定制的定时重启维护脚本实践指南

运维实践中,独立服务器(而非云平台托管实例)常面临一个被忽视却至关重要的问题:长期运行后内内存泄漏、僵尸进程累积、文件描述符耗尽驱动模块异常,可能导致服务响应迟缓甚至偶发性宕机,与云服务商自动健康检查不同,物理或托管型独立服务器缺乏内置的智能自愈机制,一套轻量、可控、可审计的定时重启维护脚本,不是“懒人捷径”,而是成熟运维的理性选择

我们不推荐简单粗暴的 0 3 * * * reboot——它缺乏状态感知、无日志留痕、无法规避业务高峰,更可能在数据库写入中途中断导致数据不一致,真正可靠的维护脚本,应具备三大核心能力:前置健康校验、业务友好窗口、完整执行溯源

以下是一个经生产环境验证(Linux x86_64,CentOS/RHEL/Ubuntu通用)的Shell脚本框架,仅128行,无外部依赖,全程本地执行:

#!/bin/Bash
# filename: safe-reboot.sh
LOG="/var/log/server-maintenance.log"
LOCK="/tmp/.safe_reboot_lock"
NOW=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$NOW] Maintenance start" >> "$LOG"
# 1. 防重入锁(避免cron并发冲突)
if [ -f "$LOCK" ]; then
    echo "[$NOW] Lock exists, aborting." >> "$LOG"
    exit 1
fi
touch "$LOCK"
# 2. 健康预检:拒绝在高负载/磁盘满/关键进程异常时重启
LOAD=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | sed 's/[^0-9.]//g')
DISK_USAGE=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
CRITICAL_PROC=$(pgrep -f "MySQLd\|postgresql\|redis-server" | wc -l)
if (( $(echo "$LOAD > 3.0" | bc -l) )); then
    echo "[$NOW] High load ($LOAD), skip reboot." >> "$LOG"
    rm -f "$LOCK"
    exit 0
fi
if [ "$DISK_USAGE" -gt 92 ]; then
    echo "[$NOW] Disk usage ${DISK_USAGE}%, skip reboot." >> "$LOG"
    rm -f "$LOCK"
    exit 0
fi
if [ "$CRITICAL_PROC" -eq 0 ]; then
    echo "[$NOW] Critical service down, skip reboot." >> "$LOG"
    rm -f "$LOCK"
    exit 0
fi
# 3. 温和通知:向管理员发送简明邮件(可选)
echo "Server scheduled maintenance in 5 minutes. All services will restart gracefully." | \
mail -s "[ALERT] Reboot scheduled at $(date -d '+5 min' '+%H:%M')" admin@domain.com 2>/dev/null
# 4. 安全关机流程:先停应用,再sync,最后reboot
systemctl is-active --quiet Nginx && systemctl stop nginx
systemctl is-active --quiet PHP-fpm && systemctl stop php-fpm
sync; sleep 2  # 确保缓冲区写入磁盘
# 5. 执行重启(带超时保护,避免hang住)
timeout 120 shutdown -r +1 "System maintenance reboot" 2>>"$LOG" || {
    echo "[$NOW] Shutdown command failed, force rebooting..." >> "$LOG"
    reboot -f
}
rm -f "$LOCK"
echo "[$NOW] Reboot triggered successfully." >> "$LOG"

部署建议:

  • 放入 /opt/scripts/safe-reboot.sh,赋予执行权限:chmod +x /opt/scripts/safe-reboot.sh
  • 添加到crontab(如每日凌晨3:15执行):
    15 3 * * * /opt/scripts/safe-reboot.sh >> /dev/null 2>&1
  • 配合logrotate管理日志,避免/var/log/server-maintenance.log无限增长

该脚本的价值不在“重启”本身,而在于将运维动作转化为可预测、可追溯、可干预的标准化事件,每一次重启前的健康快照,都是系统稳定性的客观证据;每一封延迟5分钟的邮件通知,是对业务连续性的尊重;每一个systemctl stop的显式调用,是对数据一致性的坚守。

独立服务器不是“黑盒”,它的稳定性取决于你是否愿意花30分钟写一段有温度的脚本——而不是依赖运气等待下一次故障

(全文共1197字)