Simonl 发表于 2020-7-14 17:54

断电自动关机

本帖最后由 Simonl 于 2020-9-8 14:44 编辑

前段时间买了个ups,自动关机只支持群晖,不支持Windows的系统,所以自己写了一个判断是否断电然后执行关机。
首先,要用到这个脚本,需要有UPS,你们不要纠结‘断电不就关机了吗?’,有UPS断电不会关机,没有UPS可以忽略好吧,不要我一直解释。
还有我这个不是通过ping来判断的,我通过requests模块来判断,如果能访问不出错,则表示网络正常,而且还有容错,两分钟内如果网络恢复,则取消关机,你也可以自己改,反正我源码都放上来了。

我主要是分享一个思路,大家不要杠了,我知道方法千千万。
import requests,os,time
w=0
ww=False
t=True
while True:    #无限循环
    try:
      a=requests.get('http://192.168.168.1')#如果路由器不通,则会报错,报错就会执行报错以下的命令
      w+=1#记录次数
      if ww:#如果'ww'为‘真’,则执行,否则不执行
            print('网络恢复正常,取消关机')
            os.system('shutdown /a')
            ww=False#如果取消了关机,则‘ww’改成‘假’,这样这条代码就不会执行
            t=True#如果网络恢复,则把‘t’恢复成‘真’
      else:
            pass
      print(w, '正常,继续循环')
    except:
      print('断网,执行关机')
      if t:
            os.system('shutdown /f /s /t 120 /c "两分钟后强制关机"')
            ww=True #如果执行了到这里,则改回‘真’,这样才能让前面if能执行取消关机的命令
            t=False #为了防止重复执行,执行完一遍之后‘t’变成‘假’,就不会往下执行
      else:
            pass
    time.sleep(3)   #暂停3秒执行一次

2020-9-8更新下日记功能,记录啥时候执行过关机
import requests,os,time,datetime
w=0
ww=False
t=True
while True:    #无限循环
    try:
      a=requests.get('http://192.168.31.1')#如果路由器不通,则会报错,报错就会执行报错以下的命令
      w+=1#记录次数
      if ww:#如果'ww'为‘真’,则执行,否则不执行
            now=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')# 获取现在的时间
            print(now+'网络恢复正常,取消关机')
            with open(r'关机日记.txt','a')as f:
                f.write(now+'取消关机操作'+'\n')#写入取消关机的时间到日记
                print('日记写入成功')
            os.system('shutdown /a')
            ww=False#如果取消了关机,则‘ww’改成‘假’,这样这条代码就不会执行
            t=True#如果网络恢复,则把‘t’恢复成‘真’
      else:
            pass
      print(w, '正常,继续循环')
    except:
      if t:
            os.system('shutdown /f /s /t 120 /c "两分钟后强制关机"')
            M=int(datetime.datetime.now().strftime('%M'))*60+int(datetime.datetime.now().strftime('%S'))#获取执行命令后的时间,分钟数和秒数相加
            nowTime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')# 获取现在的时间
            print(nowTime+'网络断开,120s后执行关机')   #显示执行关机的时间
            with open(r'关机日记.txt','a')as f:
                f.write(nowTime+'执行关机操作'+'\n')
                print('日记写入成功')
            ww=True #如果执行了到这里,则改回‘真’,这样才能让前面if能执行取消关机的命令
            t=False #为了防止重复执行,执行完一遍之后‘t’变成‘假’,就不会往下执行
      else:
            M1 = int(datetime.datetime.now().strftime('%M'))*60+int(datetime.datetime.now().strftime('%S')) #每次执行到这里实时的秒数
            s=120-int(M1-M) #这里计算现在获取到的时间和执行关机命令的时候的时间的一个差值,用120减去差值,就是还剩下的值
            if s==0:
                print('时间到,关机')
            else:
                print('距离关机还有%s秒'%s)
    time.sleep(3)   #暂停3秒执行一次

fortytwo 发表于 2020-7-14 18:34

netspirit 发表于 2020-7-14 18:12
你这个很不稳定 万一网络抽风你电脑突然就关了呀

不会的,网络再不稳定也不会Ping不通内网,除非可能WIFI信号啥的,有干扰源,短暂收不到信号,不过看情况好像是有线链接的。

ymc453 发表于 2021-3-23 21:26

Simonl 发表于 2021-3-23 10:42
你机房有没有没接入你这个系统的设备,断电它也断电,可以通过ping那台设备来判断是不是断电了

这倒是个思路,故意搞一个没有接UPS的设备,然后就能判断了。不过场景还要想想,数据中心机房应该是很难用上,毕竟可能是双路市电+UPS的组合了。

Simonl 发表于 2020-7-14 17:56

还可以改进,后面有时间再更新下

netspirit 发表于 2020-7-14 18:12

你这个很不稳定 万一网络抽风你电脑突然就关了呀

63331069 发表于 2020-7-14 18:13

Summer大大 发表于 2020-7-14 18:10
你这不是断网吗??断电的话电脑不是已经关机了吗

人家有一个UPS,所以有用。

8204118 发表于 2020-7-14 18:15

断电还有不关机的?笔记本电脑?

w92vv 发表于 2020-7-14 18:21

断电自动关机?啥玩意?{:301_1008:}

luofeng3000 发表于 2020-7-14 18:24

非常牛逼,都是大牛啊

罩到胸前必有沟 发表于 2020-7-14 18:33

断电就关机啊

burning 发表于 2020-7-14 18:39

@Simonl            这个我发过了,并且制作了linux版
页: [1] 2 3 4 5
查看完整版本: 断电自动关机