收起左侧

自己动手,丰衣足食,使用非智能UPS,停电时实现飞牛NAS自动关机。

12
回复
1474
查看
[ 复制链接 ]

4

主题

16

回帖

5

牛值

初出茅庐

2025-6-3 11:06:38 显示全部楼层 阅读模式
市面上UPS品牌数量众多,但是很多ups不支持飞牛系统,尤其是老式UPS设备保有量不小,它们根本没有USB通讯接口,只能单纯提供电源维持一段时间,无法直接和飞牛的系统直接互动,无法尽快让NAS自动关机,遇上停电情况,不要说远程,即使人在机器旁边,由于停电或断 电时,连局域网都没有,几近束手无措,如果再遇UPS电池容量低,电力又不能及时恢复的话,眼睁睁空等电池耗尽直接断 电,结果会导致冲击硬盘、丢失数据的风险,等效于没有停电保护。
停电时如何安全实现关机,保护数据和硬盘的安全,是当务之急。该怎么办?论坛里有不少网友提出这个需求,飞牛官方反馈认为是需求优先级较低,但是对于普通的DIYer来说,保护硬盘和数据安全是头等大事,不能等!!!还是自己动手干起来吧。
我编写了一个脚本,监测路由器网关地址是否能ping通,判断 电力是否正常,当路由器192.168.1.1在3分钟内一直都是失败的情况下,可视为出现无法恢复的电力故障,进而对飞牛NAS实施关闭全部进程,然后自动关机。

开始之前要先开启飞牛的ssh,关于ssh工具如何使用我这里不再赘述。ssh登录后,用sudo -i 取得root权限。然后从第二步逐条执行代码:

第一步,准备建立核心脚本:network_watchdog.sh,内容如下:

------分割线别复制------

# 网络监控脚本:断网3分钟后自动关闭进程并关机
# 检测目标(根据自身网路网段,建议用网关IP或可靠公网IP如114.114.114.114)
TARGET_IP="192.168.1.1"
# 最大连续失败次数(3分钟 = 180秒,按每10秒检测一次)
MAX_FAILS=3
LOG_FILE="/var/log/network_watchdog.log"
# 记录日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
}
# 检测网络连通性
ping -c 1 -W 2 $TARGET_IP > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo 0 > /tmp/network_fails.count  # 网络正常,重置计数器
    exit 0
fi
# 网络异常:增加失败计数
FAIL_COUNT=$(cat /tmp/network_fails.count 2>/dev/null || echo 0)
((FAIL_COUNT++))
echo $FAIL_COUNT > /tmp/network_fails.count
# 未达阈值则退出
if [ $FAIL_COUNT -lt $MAX_FAILS ]; then
    log "网络异常!连续失败次数: $FAIL_COUNT/$MAX_FAILS"
    exit 0
fi
# === 达到3分钟阈值 ===
log "网络中断超过3分钟!开始关闭进程并关机..."
# 1. 优雅终止所有进程(发送SIGTERM)
sudo pkill -15 -P 1  # 终止所有非系统进程[8](@ref)
# 2. 等待20秒确保进程退出
sleep 20
# 3. 强制终止残留进程(发送SIGKILL)
sudo pkill -9 -P 1
sleep 20
# 4. 同步数据并关机
sync
sleep 5
sudo shutdown -h now


------分割线别复制------

第二步,部署上述脚本

sudo nano /usr/local/bin/network_watchdog.sh  
粘贴上述第一步脚本,保存ctrl+s,退出ctrl+x
然后
sudo chmod +x /usr/local/bin/network_watchdog.sh
使network_watchdog.sh 可执行

第三步,​​配置定时任务(每10秒检测一次)​​

sudo crontab -e
添加以下行:
* * * * * for i in {0..5}; do /usr/local/bin/network_watchdog.sh; sleep 10; done

​​第四步,初始化计数器​​
echo 0 | sudo tee /tmp/network_fails.count

      通过以上部署后,先直接拔掉飞牛的网线来模拟断网,大约3分45秒后,机器优雅轻盈地关了机。
然后再次测试,同时拔掉UPS的输入电源和路由器的电源,模拟停电、断 电的场景,同样3分45秒关了机。

第五步:验证日志结果      
可查看日志效果验证:
1、查看计数记录log: tail -f /var/log/network_watchdog.log
2、查看关机记录:last -x | grep shutdown
可以清楚地看到关机的精确时间,至此大功告成。







收藏
送赞 7
分享

0

主题

9

回帖

0

牛值

江湖小虾

2025-6-4 04:53:50 显示全部楼层

只要思想不滑坡办法总比困难多呀!

2

主题

25

回帖

0

牛值

江湖小虾

2025-6-4 08:16:44 显示全部楼层

还是大佬多啊,搭配手里闲置的UPS,简直是完美

2

主题

3

回帖

0

牛值

江湖小虾

2025-6-4 14:24:38 显示全部楼层

谢谢分享

1

主题

18

回帖

0

牛值

江湖小虾

2025-6-5 01:17:01 显示全部楼层

这个方法很巧妙

1

主题

19

回帖

0

牛值

江湖小虾

2025-6-6 10:51:46 显示全部楼层

不错的方案,支持一下lol

0

主题

5

回帖

0

牛值

江湖小虾

2025-6-6 23:10:41 显示全部楼层
你最大次数填的 3,但是检测是 10s 一次,是不是有啥问题。
三分钟,没问题,好用。  详情 回复
2025-6-7 10:04

4

主题

16

回帖

5

牛值

初出茅庐

2025-6-7 10:04:57 楼主 显示全部楼层
LEON_u5b40 发表于 2025-6-6 23:10
你最大次数填的 3,但是检测是 10s 一次,是不是有啥问题。

三分钟,没问题,好用。

0

主题

27

回帖

0

牛值

江湖小虾

2025-7-1 05:33:30 显示全部楼层
请教一下大佬 如果是网络异常,无法PING通外网地址,会不会有发生误判的可能性。 另外有没有一键部署的方法呢?
如出现你假设的情况,会关机的,但本人认为即使是误判也是值得的,关机保护数据和硬盘最重要,建议ip地址设置为路由器的ip,住宅停电它肯定是ping不通了。关于一键部署,本人暂时没那个水平,本人还期望飞牛官方或坛  详情 回复
2025-7-1 09:35

4

主题

16

回帖

5

牛值

初出茅庐

2025-7-1 09:35:53 楼主 显示全部楼层
ACER 发表于 2025-7-1 05:33
请教一下大佬 如果是网络异常,无法PING通外网地址,会不会有发生误判的可能性。 另外有没有一键部署的方法 ...

如出现你假设的情况,会关机的,但本人认为即使是误判也是值得的,关机保护数据和硬盘最重要,建议ip地址设置为路由器的ip,住宅停电它肯定是ping不通了。关于一键部署,本人暂时没那个水平,本人还期望飞牛官方或坛内大佬出一个插件呢。

13

主题

106

回帖

195

牛值

共建版主

社区上线纪念勋章社区共建团荣誉勋章

2025-7-14 12:16:44 显示全部楼层

飞牛的网络管理采用的是NetworkManager,理论上也可以参考我之前udev的做法进行变通,在/etc/NetworkManager/dispatcher.d/下创建一个监听脚本,监听你正在使用的网络接口状态,当状态发生特定变化时,执行shutdown now即可。这样也不需要每十秒进行一次轮检,响应也更加迅速。

可以可以,您又多一条路子。我已运行了月余,测试停电数次,很稳。  详情 回复
2025-7-14 13:40

4

主题

16

回帖

5

牛值

初出茅庐

2025-7-14 13:40:09 楼主 显示全部楼层
EWEDL 发表于 2025-7-14 12:16
飞牛的网络管理采用的是NetworkManager,理论上也可以参考我之前udev的做法进行变通,在/etc/NetworkManage ...

可以可以,您又多一条路子。我已运行了月余,测试停电数次,很稳。

6

主题

15

回帖

0

牛值

fnOS系统内测组

不错,值得参考victory

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则