![当 NUT 报告 UPS 电池电量低时运行各种 shell 命令](https://linux22.com/image/58410/%E5%BD%93%20NUT%20%E6%8A%A5%E5%91%8A%20UPS%20%E7%94%B5%E6%B1%A0%E7%94%B5%E9%87%8F%E4%BD%8E%E6%97%B6%E8%BF%90%E8%A1%8C%E5%90%84%E7%A7%8D%20shell%20%E5%91%BD%E4%BB%A4.png)
在 Debian 服务器上,我已成功安装该nut
软件包,以便可以通过 USB 获取我的 Ellipse PRO 1200 UPS 的状态(upsc my-ups
返回电池电量)。
注意:我还没有测试过停电时会发生什么。
该 UPS 为该 Debian 服务器以外的其他设备供电:一些路由器/交换机和 NAS。
在这种情况下,考虑到我认为 NUT 的工作原理,我应该在 NAS 上安装 NUT 并将其声明为 NUT 从属设备,这样 Debian 服务器(NUT 主设备)会在电池电量不足时命令 NAS 关闭,然后自行关闭。
问题是我无法在 NAS 上安装 NUT(不支持操作系统),但我可以通过 SSH 连接到它并告诉它关闭。
我如何/在哪里可以将我自己的脚本与 NUT 通常运行的脚本一起放置以命令其从属设备关闭?
我唯一能找到的地方SHUTDOWNCMD
是/etc/nut/upsmon.conf文件:
SHUTDOWNCMD "/sbin/shutdown -h +0"
我猜我可以用一个手工编写的脚本替换这个命令,该脚本将运行 SSH-shutdown-command,并以关闭 Debian 服务器结束。
问题SHUTDOWNCMD
似乎是针对最后一次操作:当电池电量非常低时。在我自己的脚本中联系所有其他设备可能比电池耗尽之前花费更多的时间。
谢谢
答案1
您可以尝试upssched.conf(5)
在事件触发后在计时器上运行您自己的脚本。
基本upssched.conf
是这样的:
CMDSCRIPT /bin/your-script.sh
AT ONBATT * EXECUTE emailonbatt
AT ONBATT * START-TIMER upsonbatt 300
AT ONLINE * EXECUTE emailonline
AT ONLINE * CANCEL-TIMER upsonbatt upsonline
有了这个,NUT 将:
- UPS 使用电池供电后,立即运行
/bin/your-script.sh emailonbatt
。 - UPS 使用电池供电五分钟后,运行
/bin/your-script.sh upsonbatt
。 - UPS 恢复线路电源后立即运行
/bin/your-script.sh emailonline
。 - 在 UPS 恢复线路电源后,
upsonbatt
如果计时器仍处于活动状态,也应立即取消该计时器。否则,运行/bin/your-script.sh upsonline
.
该脚本可能类似于:
#!/bin/bash
case $1 in
emailonbatt)
mail -s "UPS on battery power" [email protected]
;;
emailonline)
mail -s "UPS on line power" [email protected]
;;
upsonbatt)
ssh root@nas shutdown -h +0
;;
upsonline)
etherwake 01:23:45:AB:CD:EF
;;
esac
AT 语句的语法可以在 for 的手册页中找到upssched.conf(5)
,可用的通知事件类型可以在 for 的手册页中找到upsmon(8)
。
答案2
你想要做的(使用预先建立的钩子)是最优雅的方法。
但是,当由于没有钩子或钩子不适合您的需求而无法做到这一点时,轮询方法也是一种选择。
/var/log
您可以在文件中监视 NUT 组件的输出。
例如,我的(Debian 7 上的 Salicru UPS)记录了以下内容:
10 月 28 日 13:37:49 主机名 upsmon[1766]:UPS salicru@caramon 电池供电
当 UPS 切换到电池时,这
10 月 28 日 13:39:39 主机名 upsmon[1766]:UPS salicru@caramon 在线电源
当电源恢复时。
您可以模拟电源故障,查看日志消息,然后编写一个每分钟(或 5 分钟)运行一次的 cron 作业,在日志中查找这些行并执行您想要的操作。