NAS+非智能UPS,你可以这样做让NAS自动关机

2019-07-31 18:40:41 21点赞 206收藏 33评论

一、前言

上次我写了篇入门nas我是如何保证数据安全的,有人对ups比较关心,但是我发现可以通知nas关机的都比较贵,因此我萌生了一个想法,普通的ups比较便宜,我能不能侧面的实现以下停电后自动关机?

700元nas+单块监控盘 用了18个月,我是如何保证数据安全的一、写在最前面如果你仅仅是想存个家庭的照片,顺带可以备份一些其他类型的重要数据,挂个bt下载,此文的廉价nas适合您考虑,如果您的要求较高,还要搭建流媒体服务(其实本文的方案也可以支持,只是效果不太好),或者其他对性能(nas性能)有要求的话,它并不适合您。本文仅仅适合需求不高的家庭用户,主要用于备值友6666666666| 71 评论133 收藏642查看详情


nas上的3种ups选项,都是要花银子的智能ups,这样才能通知nas开机、关机nas上的3种ups选项,都是要花银子的智能ups,这样才能通知nas开机、关机

花银子?这明显违背了我值(又)友(穷)的精(又)神(抠),于是经过我开始了我的测试之旅,最后敲定的方案是:nas通过ping路由器来判断路由器是否断电,如果不通则有可能是断电了,要准备好给nas关机,说起来就是一句话,实现起来却要避开一些问题,比如说路由器波动导致ping不通?或者我手动重启了路由器,短时间ping不通了怎么避免?等等一系列问题如何去避免“非停电”情况下的重启呢?

首先打个预防针,目前我这方案并不完美,还存在一个未解决(但不是不能解决)的缺陷问题,文末我再说出来。

希望值友读了本文后可以发散思维,想出更好的方式,本文需要具有一定linux基础的朋友可以尝试。

二、详细过程

首先要实现上面的方案,我们需要在nas上运行一段代码,这段代码负责ping路由器,如果通就ok,如果不通就通知nas关机。这段代码可以是任何语言开发(前提是你nas的配置足够高),由于我这入门级的nas,配置那是相当的捉鸡,我就决定用linux的shell来写这段命令。

先简单给不懂linux的朋友讲解一下吧(其实我对linux也不熟悉,每步操作都要去百度),linux和windows一样,都是操作系统,linux也可以像windows一样拥有图形化的操作,通常一些性能不高的设备(路由器或者入门级的nas)就会采用linux,他比起windows而言,内存cpu要求更低(就是低配置也可以流畅运行)。因此我这个方案的实现本质就是写一段linux可以执行的命令(类似在windows上写了一个bat文件)。

好了,既然linux也是操作系统,那我们怎么连上去操作呢?接下来就正文了,我尽量简单的描述、讲解各个步骤。

1.准备好两个工具,putty和winscp,他们的作用是什么?

NAS+非智能UPS,你可以这样做让NAS自动关机

putty你可以理解为widnows的cmd,用来在linux系统中执行命令

winscp可以理解为windows的资源管理器,用来连接到linux之后,可以图形化访问linux系统中的文件,方便我们拷贝、查看。

这两个工具在互联网上很容易就搜出来了,我不过多说了。

2.首先打开putty,输入nas的ip地址,端口保持默认不变

NAS+非智能UPS,你可以这样做让NAS自动关机

3.点击ok之后就打开一个类似我们平时使用的cmd的界面,按要求输入账号,admin就是我nas的登录账号(威联通,群辉未知)

NAS+非智能UPS,你可以这样做让NAS自动关机

3.回车之后又会要求输入密码,这个密码输入光标不会动,字符也不会显示出来,不用管,你直接输入回车就行了

NAS+非智能UPS,你可以这样做让NAS自动关机

4.如果账号密码没有错误就会进入到这个状态,这就代表登录成功了

NAS+非智能UPS,你可以这样做让NAS自动关机

5.输入cd /opt/ 进入到/OPT目录下,这个目录一般在linux上用来存放我们自己的软件,先放这里吧

NAS+非智能UPS,你可以这样做让NAS自动关机

到这里之后,putty窗口先放着,我们去打开另一个软件

6.打开winscp,选择新建站点,在主机名输入nas的ip地址、账号密码

NAS+非智能UPS,你可以这样做让NAS自动关机

7.登录成功后,进入/opt目录,将autoShutdown.sh拷贝进去(这个sh文件别急,我马上就讲)

NAS+非智能UPS,你可以这样做让NAS自动关机

8.在桌面新建一个txt文件,重新命名为autoShutdown.sh,右键用记事本打开,然后复制下面这段代码拷贝进去

#!/bin/sh

ip="192.168.1.1"
time=60
restartCnt=10


dir="/opt/switch"
templog="/opt/log.log"
resultlog="/opt/result.log"


failCount=0
timing=`date +%Y/%m/%d/%H:%M:%S`
echo $timing 'start work!' > $resultlog
for line in `cat $dir`
do
echo 'switch is '$line >> $resultlog
while test[ $line -eq '1' ]; do
ping -c 4 $ip > $templog
losspag=`grep "0 packets received" $templog`
now=`date +%Y/%m/%d/%H:%M:%S`
if test -z "$losspag" ;
then
echo $now 'success' >> $resultlog
failCount=0
else
let failCount+=1
echo $now $failCount >> $resultlog
if test[ $failCount -gt $restartCnt ] ;
then
echo 'restart' >> $resultlog
### shutdown -h now
fi
fi
sleep $time
done
done


ps:注意里面的shutdown -h now前面我加了井号,这行命令就暂时不会执行,这行命令是关机命令,注释他是因为我们还需要调试这些命令是否会如预期执行,避免有问题还把nas关闭就不好了。NAS+非智能UPS,你可以这样做让NAS自动关机

讲一下这段命令中的3个关键项,如果你要用着3个地方要修改一下:

ip="192.168.1.1" 这个就是你的路由器ip地址,简单的说这个地址ping不通就代表可能停电了
time=60 这个间隔时间,单位秒,两次ping间隔60秒,太频繁也不好,因此间隔60秒比较合适
restartCnt=10 这个是ping不通路由器的时候算一次连接失败,当连接失败次数超过这个数值则认定为停电了,通知nas关机。可以避免因为我们重启路由器之类的短时间ping不通nas也关机了。restartCnt和time建议不要设置小了

默认的这两个数值,间隔60秒执行一次,连续10次都不通的话就是10*60=600秒,意思就是10分钟路由器都不通则关闭nas。10分钟或者20分钟我觉得都是比较合适的。

9.这个时候,我们再putty输入vim autoShutdown.sh, vim命令是编辑,实际我们编辑可以在winscp里面右击编辑,比命令方便多了。在这里输入vim 进入编辑是为了修改文件的格式,因为我们的文件从windows拷贝进去,很可能格式是dos,需要修改为unix。

NAS+非智能UPS,你可以这样做让NAS自动关机

打开后看到文本内容了,什么都不要做,按下shift+:进入命令模式打开后看到文本内容了,什么都不要做,按下shift+:进入命令模式

在命令下输入 set ff=unix,回车在命令下输入 set ff=unix,回车

然后再次按下shift+:进入命令模式,输入wq,回车。wq的意思就是写入、退出,回车之后就退出编辑器了。

10.又切换到winscp来,在autoShutdown同目录下创建一个文件,取名“switch”

NAS+非智能UPS,你可以这样做让NAS自动关机

右击创建的文件,编辑,在里面输入一个1右击创建的文件,编辑,在里面输入一个1

这个文件就是一个简易开关,以后不想用的时候,把里面的内容改为0,保存,重启就不会再检查路由器能否ping通了。这个就是一个开关,根据内容,如果是1程序就生效,如果是0程序就不生效。

ps:如果路由器ip变了,要在开机10分钟内(前面设置的time*restartCnt 秒)把这个文件删除或者修改内容为0.然后重启,否则每次开机就会10分钟关闭,如果你要用我这个方案,我想应该也是有点动手能力的,应该不难吧?

11.工作基本上结束了,我们来运行一下,输入./autoShutdown.sh

NAS+非智能UPS,你可以这样做让NAS自动关机

第一次运行可能会提示没有权限,执行chmod -R 777 autoShutdown.sh 来给这个文件设置权限,777就代表给所有用户全部权限,我们这个自己玩的,也可以给755,甚至可以在winscp里面右击autoShutdown.sh选属性,在属性里面勾选权限(和windows差不多的)

有权限后,再次输入./autoShutdown.sh

然后就可以看到result.log里面的内容了,全部是ping通了的(这里间隔只有几秒是因为我为了测试吧间隔时间参数(time)设置的5秒)然后就可以看到result.log里面的内容了,全部是ping通了的(这里间隔只有几秒是因为我为了测试吧间隔时间参数(time)设置的5秒)

这个时候,putty命令行是无法输入命令的状态,我们按下ctrl+c中止命令的执行,修改autoShutdown的ip参数为一个不存在的ip地址“192.168.33.2”,然后再次输入./autoShutdown.sh运行

NAS+非智能UPS,你可以这样做让NAS自动关机

发现全部是失败的,日期后面的1、2、3、4就是失败次数累加,这个次数在成功之后会归0.

这样,脚本应该是没有问题的了,我们在winscp中右击autoShutdown.sh-编辑,把里面的“### shutdown -h now”前面的井号全部去掉,去掉之后:shutdown -h now,保存文件。

然后,再次输入./autoShutdown.sh

等待一会之后就会发现putty上的linux连接已经断开,至此我们的操作就差不多了。

12.最后需要解决的一个问题就是开机启动,我们的目的是要linux开机之后执行一句代码:

/opt/autoShutdown.sh &

NAS+非智能UPS,你可以这样做让NAS自动关机 如果nas一年都不怎么停电只是为了预防万一,我觉得可以不设置开机启动,每次出现意外关机连进去输入一次上面的命令就好了。

由于linux不同的版本开机启动有一些差异、并且添加开机启动方法也不止一种,这个大家可以去网上搜一下,这句代码尾巴上有一个“ &”,意思就是让这个脚本在后台运行。什么是后台运行?刚才我们输入./autoShutdown.sh之后,就无法输入命令了,要按下ctrl+c才能输入,实际你按下ctrl+c的时候,这个程序就被结束了。后台运行就是让这个程序自动运行,而不需要我们提供一个终端窗口挂着。

NAS+非智能UPS,你可以这样做让NAS自动关机

加了&执行后会输出一个数字,这个数字就是这个后台进程的进程id,并且执行后就可以输入新的命令,而这个进程则保持后台持续运行。

最最最最重要的提示!最最最最重要的提示!最最最最重要的提示:

这里需要特别提醒的是,我的shell命令在你的系统上不一定能100%直接执行,可能需要调试,linux比较繁琐的就在这里,没调试好之前,建议直接把shutdown -h now那行代码删掉,测试好再加上去。还有没测试好之前千万别加到开机启动,不然,你那电脑可能就开机-关机-开机-关机-开机-关机。。。。。

好了,整体流程就是这样的,由于对linux不说熟悉,这段shell折腾了2天,目前我们还差一个来电之后自动通知nas开机的功能,实现思路嘛,我打算在路由器上运行shell,开机就给nas发送wol包网络唤醒,linux发送wol包还是很方便的,ether-wake -b mac地址。

最后,多谢各位耐心看到这里!NAS+非智能UPS,你可以这样做让NAS自动关机

三、最后

总结一下我们这个方案的优缺点:

优点:

1.当然是省银子,这才是咱们值友的精神所在

2.节约了一个usb接口(ups如果是usb通信的话,需要占用设备一个usb)

缺点:

1.无法通电自动开机,如果要实现这个功能,还需要在路由器上去写一个开机后wol唤醒nas的shell

2.对动手能力有一定的要求

3.我这命令有个小坑,一旦运行起来之后就不会去检查switch文件的内容了,现在的命令逻辑必须要重启或者手动结束这个进程

展开 收起
33评论

  • 精彩
  • 最新
  • 断电后是无法wol醒的,无论用什么nas都是这样,只能设置主板通电开机

    校验提示文案

    提交
    那就看主板支不支持wol

    校验提示文案

    提交
    问题是接在了UPS上,主板是一直通着电的.没办法再去检测市电啊,这有点无解。

    校验提示文案

    提交
    还有1条回复
    收起所有回复
  • 我发现我粘贴命令有些字符被消灭了,后面审核通过了我补充一个下载地址,我上传一下

    校验提示文案

    提交
    看错了,应该没问题

    校验提示文案

    提交
    大佬 代码可以加依稀下载链接么 用不了了 好像少什么东东

    校验提示文案

    提交
    还有1条回复
    收起所有回复
  • 我是西数ex2 ultra,通过usb连到ups,可以看到电量和状态。但是西数不能自动断电关机,你这个办法管用吗?

    校验提示文案

    提交
    我这个关机不是依赖UPS和nas通信,是nas检查路由器联通情况,相比和nas通信肯定你这种稳定,但是你不行应该先去咨询UPS厂家

    校验提示文案

    提交
    收起所有回复
  • 你这个代码应该改成60秒关机,要不然很容易出现重复关机,逻辑设置错误就麻烦了

    校验提示文案

    提交
    兄弟,你仔细看,我这个是间隔60秒ping一次,连续10次不通才关机

    校验提示文案

    提交
    我是手残党,有一次写类似的代码,也是直接关机,变量写死,然后每次都直接关机,后来就喜欢留有余地了,比方停电实际你自己在操作

    校验提示文案

    提交
    还有3条回复
    收起所有回复
  • 一般用了UPS的话,会把路由和光猫也接在UPS后面,实现停电不断网。所以还是买个能通知NAS电源状态的UPS靠谱

    校验提示文案

    提交
    我们的光纤全部在车库有个汇总的机柜,怕是停电的话,光猫有电也不行

    校验提示文案

    提交
    买个带网关的插座或插头就行,插在非UPS线路上,只要断电插座离线ping不通,连续3次以上就关闭NAS。

    校验提示文案

    提交
    收起所有回复
  • 会影响群晖睡眠么?

    校验提示文案

    提交
    不确定,兄弟 [高兴]

    校验提示文案

    提交
    收起所有回复
  • while test[ $line -eq '1' ]; do 这一行提示./autoShutdown.sh: 19: ./autoShutdown.sh: test[: not found 而且你的图里没test。我的内核是debian 8.3.0-6

    校验提示文案

    提交
    我是centos

    校验提示文案

    提交
    收起所有回复
  • UNRIAD可以直接用这个脚本吗?手里有台不带通讯的ups在黑群晖上可以用ping路由的方式关机,现在用unraid,还想使用起来,要不闲着就是浪费

    校验提示文案

    提交
    理论上能跑linux命令的都可以,脚本有点久远了,行不行还要靠折腾

    校验提示文案

    提交
    感谢回复,先试一下

    校验提示文案

    提交
    收起所有回复
  • 不是有个300左右的智能关机的ups么,硕天的。。不过我没搞这个。。没啥重要数据,硬盘坏了就买新的。。努力佛系一些

    校验提示文案

    提交
  • 传统做法里NAS会在断电后发送邮件通知,也就是路由器和光猫也接在UPS下,这样就算外面断电了,NAS的网络依然可以运行一段时间。按照楼主的做法路由器是不在UPS的保护下的,断电后只会收到群晖官方的联机中断通知,无法判断究竟是家里断电了还是synology.me的网络通信不良。

    校验提示文案

    提交
  • 路由器之类的网络设施不用nas吗? [无语]

    校验提示文案

    提交
  • 创造性解决问题,乃我穷折腾一党之党义!

    校验提示文案

    提交
  • 谢谢分享如此通俗易懂的脚本帖子。我看了几个教程了,最不明白的就是,脚本文件为什么不直接放在nas的共享卷的文件夹里?就像win的批处理一样,要用的时候直接cmd再输入Run C:\*\*\*.bat

    校验提示文案

    提交
    听说是会影响NAS硬盘的自动休眠

    校验提示文案

    提交
    我从不开休眠的,伤盘,个人感觉。

    校验提示文案

    提交
    收起所有回复
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
206
扫一下,分享更方便,购买更轻松