UPS断电自动备份关机脚本保护住宅服务器
为什么你的住宅服务器需要 UPS 自动关机脚本
住宅服务器(如自建NAS、家庭网关)经常7x24小时运行,一旦发生意外断电,磁盘缓存里的数据来不及写入就可能损坏文件系统。
给UPS配上自动备份关机脚本,能在断电后争取几十秒时间执行关键数据备份,然后干净地关闭系统,保护硬盘和数据安全。
本文基于NUT(Network UPS Tools)实现,适合大多数支持USB通讯的家用UPS。
准备工作:硬件连接与 NUT 安装
1. 连接 UPS 并确认通讯
将UPS通过USB线连接到服务器,登录系统后执行 lsusb 查看是否识别到UPS设备。
如果看到类似 American Power Conversion 或 CyberPower 的条目说明连接正常。
2. 安装 NUT 软件
sudo apt update
sudo apt install nut nut-client nut-server
安装完成后会进入配置向导,选择“单机模式(local only)”,后续再手动调整配置文件。
编写自动化备份与关机脚本
创建两个脚本:一个只做备份,一个用于NUT触发时调用(先备份再关机)。
步骤一:创建备份脚本
sudo nano /usr/local/bin/backup-before-shutdown.sh
写入以下内容(以备份 /home 和 /var/lib/mysql 为例):
#!/bin/bash
# 备份到 /data/backup,可根据需要修改
tar -czf /data/backup/home-$(date +%Y%m%d%H%M).tar.gz /home
tar -czf /data/backup/mysql-$(date +%Y%m%d%H%M).tar.gz /var/lib/mysql
保存后赋予执行权限:
sudo chmod +x /usr/local/bin/backup-before-shutdown.sh
步骤二:创建NUT事件触发脚本
NUT在UPS进入电池模式后会调用指定脚本。
创建 /usr/local/bin/ups-shutdown.sh:
#!/bin/bash
# 先执行备份
/usr/local/bin/backup-before-shutdown.sh
# 等待10秒确保备份完成
sleep 10
# 执行关机(需sudo权限)
/sbin/shutdown -h now
同样赋权:
sudo chmod +x /usr/local/bin/ups-shutdown.sh
配置 NUT 事件响应
编辑NUT主配置文件 /etc/nut/upsmon.conf,找到 SHUTDOWNCMD 和 NOTIFYCMD 相关行:
# 将默认关机命令替换为我们的脚本
SHUTDOWNCMD "/usr/local/bin/ups-shutdown.sh"
# 设置当UPS进入电池模式时执行自定义脚本
NOTIFYCMD /usr/local/bin/ups-shutdown.sh
# 确保以下通知类型触发脚本
NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC
重启NUT服务生效:
sudo systemctl restart nut-server nut-monitor
如果使用apcupsd等其他软件,可参考对应文档,但原理一致——将UPS断电事件与自定义备份关机脚本绑定。
测试与验证断电保护是否生效
不要直接拔电测试,建议先模拟:
- 查看UPS状态:
upsc ups(需根据配置替换UPS名称,通常为ups)。 - 手动将UPS切换为电池模式(部分UPS支持通过软件模拟)。
- 确认日志中出现
UPS on battery且脚本被执行:
journalctl -u nut-monitor -f
看到类似 Executing command: /usr/local/bin/ups-shutdown.sh 即成功。
如果你愿意冒一点风险,可以拔掉UPS电源线观察服务器是否在60秒(NUT默认延迟)后自动备份并关机。
重新上电后检查备份文件是否生成。
常见问题与避坑指南
Q:UPS通讯不上,upsc显示无数据?
A:检查USB线,尝试更换USB口;查看 /etc/nut/ups.conf 中驱动和USB设备ID是否正确,常见驱动 usbhid-ups。
Q:脚本执行了但没备份成功?
A:确认备份脚本中的目标目录存在且有写入权限。可在脚本开头加入 mkdir -p /data/backup 确保目录存在。
Q:NUT服务启动失败?
A:运行 sudo nut-scanner 生成正确配置,复制到 /etc/nut/ups.conf,并将 MODE=netserver 改为 MODE=standalone(单机模式)。
避坑提醒:
- 脚本中的关机命令需要root权限,务必在
/etc/sudoers中允许NUT用户无密码执行shutdown(或直接使用root运行NUT服务)。 - 测试时先关闭重要写入任务,避免意外中断。
- 如果UPS容量较小,建议缩短NUT的
POLLFREQ和BATTERYLEVEL触发值,尽早执行关机。
完成以上配置后,你的住宅服务器就具备断电自动备份关机能力了。
日常保持UPS电池健康,再也不用担心突然停电导致数据丢失。