我用的CyberPower的UT650EGC,下面是我最近配置的UPS状态用Gotify推送,并且在长时间不恢复供电时卸载外接硬盘,因为**络唤醒,所以最后为了延长UPS使用时间,选择关机
upsc -l
- 输出为
1849591,这个编号不会变,因为配置写在了``/etc/nut/ups.conf`
- 继续查看配置
upsc 1849591
Init SSL without certificate database
battery.charge: 85
battery.charge.low: 10
battery.charge.warning: 20
battery.mfr.date: CPS
battery.runtime: 741
battery.runtime.low: 300
battery.type: PbAcid
battery.voltage: 13.3
battery.voltage.nominal: 12
device.mfr: CPS
device.model: UT650EGC
device.serial:
device.type: ups
driver.name: usbhid-ups
driver.parameter.bus: 001
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.parameter.product: UT650EGC
driver.parameter.productid: 0501
driver.parameter.synchronous: auto
driver.parameter.vendor: CPS
driver.parameter.vendorid: 0764
driver.version: 2.8.0
driver.version.data: CyberPower HID 0.6
driver.version.internal: 0.47
driver.version.usb: libusb-1.0.26 (API: 0x1000109)
input.frequency: 498.0
input.transfer.high: 295
input.transfer.low: 140
input.voltage: 219.0
input.voltage.nominal: 220
output.voltage: 220.0
ups.beeper.status: disabled
ups.delay.shutdown: 20
ups.delay.start: 30
ups.load: 31
ups.mfr: CPS
ups.model: UT650EGC
ups.productid: 0501
ups.realpower.nominal: 360
ups.serial:
ups.status: OL CHRG
ups.test.result: No test initiated
ups.timer.shutdown: -60
ups.timer.start: -60
ups.vendorid: 0764
x.additional.devicetype: USB
- ups.status为当前UPS状态,OL为市电,OB为UPS供电
NAS监控脚本
背景
- NAS:配置了WOL,可以通过路由器唤醒
- 外接硬盘柜:插电后需要手动按一下才能启动
- 路由器:来电自启
- UPS:NAS可以读取UPS是否在用电池电量,可以配置UPS收到关机指令后延迟执行的时间
运行逻辑
- 开机马上运行一次脚本,发送NAS已开机指令
- 开机后每分钟执行一次脚本,监测UPS状态,如果用了UPS电池的电,发送通知,并倒计时10分钟
- 10分钟后如果供电恢复,发送通知说关机已取消
- 10分钟后如果供电未恢复,发送通知并直接关机
脚本代码
- 新建.sh文件在
/root/ups_monitor.sh
#!/bin/bash
#配置
UPS_NAME="1849591"
GOTIFY_URL="输入Gotify链接"
GOTIFY_TOKEN="Gotify秘钥"
MOUNT_POINT="硬盘挂载卷 /vol2"
# 发送通知函数
send_notify() {
curl -s --max-time 5 -X POST "$GOTIFY_URL?token=$GOTIFY_TOKEN" \
-F "title=$1" \
-F "message=$2" \
-F "priority=$3" > /dev/null
}
# 开机通知
if [ "$1" == "boot" ]; then
sleep 60
CURRENT_IP=$(hostname -I | awk '{print $1}')
send_notify "🟢 CinerNAS启动成功" "IP: $CURRENT_IP
开机时间: $(date)" 5
exit 0
fi
# 安全锁 (开机5分钟内不执行关机策略)
UPTIME=$(cat /proc/uptime | awk '{print $1}' | cut -d. -f1)
if [ "$UPTIME" -lt 300 ]; then
exit 0
fi
# 主逻辑
STATUS=$(upsc $UPS_NAME ups.status 2>/dev/null)
if [[ "$STATUS" == *"OB"* ]]; then
# === 定义消息内容 (解决换行问题) ===
MSG_WARN="CinerNAS将在10分钟后自动关机
如果期间来电,则取消关机"
MSG_SHUT="断 电已持续10分钟
正在卸载存储卷 /vol1 并关机..."
send_notify "⚠️ CinerNAS断 电警告" "$MSG_WARN" 8
# 等待 10 分钟
sleep 600
# 再次检查
STATUS_RECHECK=$(upsc $UPS_NAME ups.status 2>/dev/null)
if [[ "$STATUS_RECHECK" == *"OL"* ]]; then
send_notify "✅ CinerNAS电源已恢复" "取消关机计划。" 5
exit 0
fi
# 还是断 电
send_notify "🔴 CinerNAS确认执行关机" "$MSG_SHUT" 10
umount -l "$MOUNT_POINT"
sleep 3
/sbin/shutdown -h now
else
:
fi
- 使用crontab来执行定时运行,打开crontab,详细使用说明详见
crontab -e
- 写入以下指令,其中时间定为
* * * * *是每分钟运行一次,里面是带锁的,防止脚本重复运行
@reboot /root/ups_monitor.sh boot >> /var/log/ups_boot.log 2>&1
* * * * * /usr/bin/flock -n /var/lock/ups_monitor.lock /root/ups_monitor.sh >> /var/log/ups_monitor.log 2>&1
常用命令
pkill -f ups_monitor.sh
ps -ef | grep ups_monitor.sh