|
市面上UPS品牌数量众多,但是很多ups不支持飞牛系统,尤其是老式UPS设备,根本没有USB通讯接口,只能单纯提供电源维持一段时间,无法直接和飞牛的系统直接对接,无法实现自动关机,这种情况,不要说远程,即使人在机器旁边,由于停电或断 电时连局域网都没有,几乎束手无措,如果UPS容量低,电力不能短时间恢的话,只能空等电池耗尽直接关机,冲击硬盘丢失数据,等于没有UPS。如何安全实现关机?保护数据和硬盘的安全,是当务之急。该怎么办?论坛里有不少网友提出这个需求,但是看官方反馈的意思似乎是需求优先级较低,但是对于普通的DIYer来说,保护硬盘才是头等大事,还是自己动手干起来。
我编写了一个脚本,监测路由器网关地址是否能ping通,判断 电力是否正常,当路由器192.168.1.1在3分钟内一直都是失败的情况下,可视为出现无法恢复的电力故障,进而对飞牛NAS实施关闭全部进程,然后自动关机。
之前要先开启飞牛的ssh,关于ssh工具的使用我这里不在赘述。ssh登录后,用sudo -i 取得root权限。
第一步,要实现网络连接监控并在断网3分钟后自动关闭进程关机的功能,可通过编写Shell脚本结合系统定时任务实现。以下是具体方案及代码实现:
建立核心脚本:network_watchdog.sh
------分割线不要复制------
#!/bin/bash
# 网络监控脚本:断网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
可以清楚地看到关机的精确时间。
|
|