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

该脚本用于在独立服务器上自动执行定时重启与维护任务,支持配置自定义时间(如凌晨低峰期)、重启前保存关键服务状态、执行系统更新或日志清理等维护操作,并记录重启日志便于审计,脚本采用Shell编写,兼容主流Linux发行版,可通过cron调度,确保服务器长期稳定运行并减少人工干预。

一个健壮的独立服务器定时重启维护脚本实践

在运维实践中,独立服务器(如物理机或独享VPS)常因长期运行积累内存泄漏、句柄耗尽或内核模块异常而性能缓慢,定期重启虽看似简单,却需兼顾安全性、服务连续性与可审计性——盲目 cron + reboot 既不优雅,也易引发意外中断,本文分享一个经过生产环境验证的轻量级定时重启维护脚本方案。

该脚本核心设计原则是「可控、可溯、可暂停」:
✅ 不直接调用 reboot,而是先执行预检(检查负载、关键进程状态、磁盘剩余空间);
✅ 支持优雅停服:自动检测并通知 systemd 服务(如 Nginx、MySQL),尝试 graceful stop;
✅ 内置维护窗口机制:仅在设定时段(如凌晨 2:00–4:00)触发,避开业务高峰;
✅ 全程记录日志,并在重启前发送简明通知(支持邮件/Telegram webhook);
✅ 提供手动暂停开关(通过 /tmp/maintenance.lock 文件控制,便于紧急干预)。

脚本主体(/opt/scripts/maint-reboot.sh)约 85 行,无外部依赖,仅需 Bash + coreutils,关键逻辑如下:

  1. 检查锁文件是否存在,存在则退出;
  2. 验证当前时间是否在允许窗口内;
  3. 执行 uptime -pfree -hdf -h /systemctl is-system-running 等健康快照;
  4. 若负载 > 1.5 或根分区使用率 > 90%,中止重启并告警;
  5. 调用 systemctl list-units --type=service --state=active --no-pager 获取活跃服务,对已配置的守护进程(如 nginx.service, postgresql.service)执行 systemctl stop --now
  6. 延迟 15 秒后执行 shutdown -r +1 "Scheduled maintenance",给予应用缓冲期;
  7. 日志写入 /var/log/maint-reboot.log,含时间戳、检查结果与操作摘要。

部署时,仅需将脚本设为可执行,再添加 cron 条目:
0 2 * * 0,3 /opt/scripts/maint-reboot.sh >> /var/log/maint-cron.log 2>&1
(每周日、三凌晨 2 点执行)

值得一提的是,该脚本不替代监控系统,而是作为“确定性维护”的补充手段,它不追求全自动修复,而是以最小侵入方式保障基础稳定性——毕竟,重启不是故障,而是对系统生命周期的主动尊重。

最后提醒:首次启用前务必在测试环境验证,并确保有带外管理通道(如 IPMI 或 VNC)以防万一,真正的可靠性,永远来自清晰的设计、审慎的验证,以及一份随时可撤回的运维敬畏心。

(全文共 698 字)