前言

对于需要 7×24 小时运行的 Linux 服务器或 NAS 设备来说,意外断电不仅是数据灾难的源头,更可能损坏文件系统甚至硬件。虽然 APC(美国电力转换公司)的 UPS 在使用 USB 连接到电脑时就能提供基础的浪涌保护,但要让系统在断电时自动、优雅地关机,还是需要专门的守护进程来管理。

apcupsd 正是一个开源的 UPS 管理守护进程,专门用于监控和控制 APC 品牌的 UPS。它负责检测市电中断、电池电量变化,并在合适时机执行安全关机,最大程度保护你的数据和硬件。

本文将详细介绍在 Ubuntu 系统下从安装、配置到使用 apcupsd 的完整流程。


1. 什么是 apcupsd?

apcupsd(APC UPS Daemon)是 APC 旗下不同型号 UPS 的电源管理守护进程。它提供了三大核心功能:

功能 说明
实时监控 通过 USB/串口/SNMP 与 UPS 通信,持续获取电压、负载、电池状态、剩余时间等信息
自动关机 市电中断且电池电量低于阈值时,自动执行系统安全关机
事件告警 断电、恢复、电池低电量等事件发生时,可通过邮件等方式通知管理员

apcupsd 附带以下主要工具:

  • apcaccess — 命令行下查询 UPS 实时状态
  • apctest — 测试和修改 UPS 的 EEPROM 参数(需先停止 apcupsd 服务)
  • apcupsd-cgi — Web 界面,方便浏览器远程监控

2. 安装 apcupsd

Ubuntu 官方仓库中已经包含了 apcupsd,一行命令即可安装:

sudo apt update
sudo apt install -y apcupsd

如果希望使用 Web 监控界面,再额外安装 CGI 包:

sudo apt install -y apcupsd-cgi

安装完成后,主要文件分布在以下位置:

路径 说明
/etc/apcupsd/apcupsd.conf 主配置文件
/etc/apcupsd/apccontrol 事件处理脚本(不建议直接修改)
/etc/default/apcupsd Debian/Ubuntu 特有的服务开关配置
/var/log/apcupsd.events 事件日志文件

3. 基本配置

3.1 备份原始配置

在修改之前,先备份原文件:

sudo cp /etc/apcupsd/apcupsd.conf /etc/apcupsd/apcupsd.conf.bak
sudo cp /etc/default/apcupsd /etc/default/apcupsd.bak

3.2 编辑主配置文件

使用编辑器打开 /etc/apcupsd/apcupsd.conf

sudo nano /etc/apcupsd/apcupsd.conf

① 设置连接方式

对于大多数通过 USB 连接的家用 / 小型 UPS(如 Back-UPS、Smart-UPS 系列),配置如下:

UPSCABLE usb
UPSTYPE usb
# DEVICE  /dev/ttyS0     ← 注释掉,USB 模式下不需要

如果你的 UPS 通过串口连接,则配置为:

UPSCABLE smart
UPSTYPE smartups
DEVICE /dev/ttyS0

如果是通过网络管理的 UPS(APC 网络管理卡),则配置为:

UPSCABLE ether
UPSTYPE net
DEVICE 192.168.1.100:3551

② 设置 UPS 名称(可选)

UPSNAME my_ups

名称可以自定义,方便在多台设备监控时区分。

③ 设置自动关机触发条件

以下三个参数配合工作,只要满足其一就会触发关机:

# 电池电量 ≤ 此百分比时触发关机
BATTERYLEVEL 30

# 剩余续航 ≤ 此分钟数时触发关机
MINUTES 10

# 市电中断后最多等待此秒数(0 表示禁用时间限制)
TIMEOUT 0

常见推荐配置:

  • 家庭服务器 / NASBATTERYLEVEL 30MINUTES 5
  • 对数据安全要求极高的场景BATTERYLEVEL 50MINUTES 10

④ 其他可选参数

# 轮询间隔(秒),默认 60
POLLTIME 60

# 电池电量低于此百分比时发出警报
BATTERYLEVEL 30

# 电池耗尽告警延迟(秒)
ALARMDEL 30

完整的配置完成后,保存文件退出。

3.3 启用 apcupsd 服务

编辑 /etc/default/apcupsd

sudo nano /etc/default/apcupsd

确保以下内容存在且未被注释:

ISCONFIGURED=yes

这一步非常关键——如果缺少这个设置,apcupsd 会拒绝启动。

3.4 启动服务并设置开机自启

sudo systemctl enable apcupsd
sudo systemctl restart apcupsd

检查服务状态:

sudo systemctl status apcupsd

输出应显示 active (running),说明服务正常运行。


4. 查看 UPS 状态 —— `apcaccess`

apcaccessapcupsd 最重要的监控命令,它从守护进程获取实时数据并格式化输出:

apcaccess

典型输出如下:

APC      : 001,036,0875
DATE     : 2026-07-24 16:30:15 +0800
HOSTNAME : myserver
VERSION  : 3.14.14 (31 May 2016) debian
UPSNAME  : my_ups
CABLE    : USB Cable
DRIVER   : USB UPS Driver
UPSMODE  : Stand Alone
STARTTIME: 2026-07-24 08:00:12 +0800
MODEL    : Back-UPS RS 1500G
STATUS   : ONLINE
LINEV    : 224.0 Volts
LOADPCT  : 12.0 Percent
BCHARGE  : 100.0 Percent
TIMELEFT : 55.3 Minutes
MBATTCHG : 30 Percent
MINTIMEL : 5 Minutes
MAXTIME  : 0 Seconds
SENSE    : Medium
LOTRANS  : 176.0 Volts
HITRANS  : 294.0 Volts
ALARMDEL : 30 Seconds
BATTV    : 27.2 Volts
LASTXFER : Unacceptable line voltage changes
NUMXFERS : 0
TONBATT  : 0 Seconds
CUMONBATT: 0 Seconds
XOFFBATT : N/A
SELFTEST : NO
STATFLAG : 0x05000008
SERIALNO : 3Q1106X37131
BATTDATE : 2024-07-05
NOMINV   : 230 Volts
NOMBATTV : 24.0 Volts
NOMPOWER : 865 Watts
FIRMWARE : 878.L4 .I USB FW:L4
END APC  : 2026-07-24 16:30:18 +0800

其中重要的字段含义:

字段 含义 正常范围
STATUS UPS 当前状态 ONLINE(正常)/ ONBATT(电池供电)
LINEV 市电输入电压 依地区不同,~220V / ~110V
LOADPCT 负载百分比 越低越好,建议 < 50%
BCHARGE 电池剩余电量百分比 正常应接近 100%
TIMELEFT 当前负载下剩余续航时间 分钟数
TONBATT 本次断电已使用电池供电的秒数 断电时累加
NUMXFERS 切换到电池供电的次数 数值越大说明市电越不稳定

5. 事件日志查看

apcupsd 将所有事件记录在 /var/log/apcupsd.events,你可以随时查看:

# 查看最近的日志
tail -f /var/log/apcupsd.events

# 查看所有日志
cat /var/log/apcupsd.events

典型事件输出示例:

2026-07-20 14:32:10 +0800  Power failure.
2026-07-20 14:32:15 +0800  Running on UPS batteries.
2026-07-20 14:37:40 +0800  Power is back. UPS running on mains.
2026-07-20 14:37:40 +0800  Mains reapparent. Shutting down UPS.

6. 自定义事件处理脚本

apcupsd 的事件处理机制非常灵活。它默认使用 /etc/apcupsd/apccontrol 脚本处理以下事件:

事件名称 触发条件
onbattery 切换到电池供电
offbattery 市电恢复
doshutdown 即将执行关机
commfailure 与 UPS 通信中断
commok 与 UPS 通信恢复
changeme 需要更换电池
emergencyshutdown 紧急关机触发
mainsback 市电恢复(UPS 切回市电)
killpower 切断 UPS 输出电源
startupscript apcupsd 启动时
stayson 系统将继续运行,无需关机

要自定义某个事件的处理行为,不要修改 apccontrol 本身,而是在 /etc/apcupsd/ 下创建以事件命名的自定义脚本。自定义脚本会在系统默认处理之前被执行。

示例:断电时发送桌面通知(需要 notify-send):

sudo tee /etc/apcupsd/onbattery << 'EOF'
#!/bin/bash
DISPLAY=:0.0 /usr/bin/notify-send -u critical "UPS 断电告警" "市电已中断,正在使用电池供电!"
EOF
sudo chmod +x /etc/apcupsd/onbattery

示例:断电时发送 HTTP 请求(如 Webhook 通知):

sudo tee /etc/apcupsd/onbattery << 'EOF'
#!/bin/bash
curl -s -o /dev/null -X POST \
  -H "Content-Type: application/json" \
  -d '{"text":"⚠️ 市电中断,UPS 切换到电池供电!"}' \
  https://hooks.example.com/webhook
EOF
sudo chmod +x /etc/apcupsd/onbattery

注意:自定义脚本必须设置可执行权限(chmod +x),否则不会被调用。


7. 设置邮件告警

apcupsd 默认使用系统邮件向 root 用户发送告警。要实现真正的邮件通知,需要安装 MTA(邮件传输代理):

sudo apt install -y exim4
sudo dpkg-reconfigure exim4-config

配置完成后,还需要将 root 邮件转发到你的真实邮箱。编辑 /etc/aliases

root: your-email@example.com

然后执行:

sudo newaliases

之后在断电、恢复、低电量等事件发生时,apcupsd 会自动发送邮件通知。


8. Web 监控界面

使用 apcupsd-cgi 配合 Apache 即可通过浏览器远程监控 UPS 状态。

8.1 安装 Web 服务器和 CGI 模块

sudo apt install -y apache2 apcupsd-cgi
# 确保 Apache 启用了 CGI 模块
sudo a2enmod cgi
sudo systemctl restart apache2

8.2 访问 Web 界面

浏览器打开:

http://your-server-ip/cgi-bin/apcupsd/multimon.cgi

Web 界面直观显示:

  • UPS 状态(绿色表示正常,红色告警)
  • 实时数据(输入电压、负载百分比、剩余电池电量、续航时间)
  • 历史事件记录

你还可以通过配置 /etc/apcupsd/multimon.conf 自定义界面中显示的参数。


9. 测试 UPS 功能 —— `apctest`

apctest 工具可以让你对 UPS 进行诊断测试和参数修改。注意:运行前必须先停止 apcupsd 服务,否则会报锁文件冲突。

sudo systemctl stop apcupsd
sudo apctest

成功进入后,你将看到交互菜单:

1) Test kill UPS power         2) Perform self-test
3) Read last self-test result  4) View/Change battery date
5) View manufacturing date     6) View/Change alarm behavior
7) View/Change sensitivity     8) View/Change low transfer voltage
9) View/Change high transfer voltage
10) Perform battery calibration
11) Test alarm                 12) View/Change self-test interval
Q) Quit

常用选项说明:

选项 用途 建议
2 执行自检 定期检查电池健康状况
3 查看上次自检结果 排查电池问题
6 设置蜂鸣器行为 夜间建议关闭蜂鸣
12 设置自检间隔(天) 默认 7 天一次即可

测试完成后记得重启服务:

sudo systemctl start apcupsd

10. NIS 网络模式(多台设备共享一台 UPS)

如果你有多台服务器共用一台 UPS,可以用 NIS(Network Information Server)模式实现联动关机。步骤如下:

主服务器(连接 UPS 的机器)

/etc/apcupsd/apcupsd.conf 中:

NETSERVER on
NISIP 0.0.0.0
NISPORT 3551

从属服务器

安装 apcupsd 后,配置为 NIS 客户端模式:

UPSCABLE ether
UPSTYPE net
DEVICE 192.168.1.10:3551

这样当主服务器因断电触发关机时,它会通知从属服务器一同安全关机。


11. 常见问题排查

Q1: apcupsd 启动失败

检查日志:

journalctl -u apcupsd -n 50 --no-pager

常见原因:

  • /etc/default/apcupsdISCONFIGURED 未设为 yes
  • USB 设备权限问题(确认 /dev/usb/hiddev*/dev/hidraw* 可读)
  • apcupsd.conf 中语法错误

Q2: `apcaccess` 显示 `COMMLOST`

表示 apcupsd 与 UPS 通信失败。尝试:

# 检查 USB 设备是否被识别
lsusb | grep -i apc

# 重启 apcupsd
sudo systemctl restart apcupsd

# 检查是否有其他程序占用了 USB 设备(如 nut)

Q3: 关机后 UPS 不断电

默认情况下,USB 连接的 UPS 在系统关机后 60 秒才会切断输出电源。这是 UPS 硬件设计决定的,确保系统有足够时间完成写盘操作。如果希望强制立即断电,可以在 /etc/apcupsd/apccontroldoshutdown 事件中添加 killpower 调用。

Q4: `apctest` 报错 "Unable to create UPS lock file"

说明 apcupsd 仍在运行。先停止服务:

sudo systemctl stop apcupsd

然后再运行 sudo apctest


结语

apcupsd 虽然诞生于 90 年代末,但它依然是 Linux 生态下最成熟、最可靠的 APC UPS 管理方案之一。从简单的 USB 连接到复杂的 NIS 多机联动,从日志监控到自定义脚本告警,它都能出色胜任。

配置完成后,建议定期用 apcaccess 查看电池健康状况,并结合 apctest 的自检功能检查 UPS 状态。毕竟,UPS 本身也是有寿命的——电池一般 3~5 年需要更换,提前发现异常远比断电时手忙脚乱要好得多。

希望这篇教程能帮你顺利搭建起自己的 UPS 管理方案,让你的服务器和数据在断电时也能安然无恙 😊


参考资源: