吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5257|回复: 45
收起左侧

[Python 转载] 断电自动关机

[复制链接]
Simonl 发表于 2020-7-14 17:54
本帖最后由 Simonl 于 2020-9-8 14:44 编辑

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

我主要是分享一个思路,大家不要杠了,我知道方法千千万。
[Asm] 纯文本查看 复制代码
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秒执行一次

微信截图_20200714175255.png 微信截图_20200714175328.png
2020-9-8更新下日记功能,记录啥时候执行过关机
[Asm] 纯文本查看 复制代码
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秒执行一次

微信图片_20200908144315.png 微信图片_20200908144327.png

免费评分

参与人数 3吾爱币 +3 热心值 +3 收起 理由
ymc453 + 1 + 1 我很赞同!
qiaozd + 1 + 1 谢谢@Thanks!
思念曹操 + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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
断电自动关机?  啥玩意?
luofeng3000 发表于 2020-7-14 18:24
非常牛逼,都是大牛啊
罩到胸前必有沟 发表于 2020-7-14 18:33
断电就关机啊
burning 发表于 2020-7-14 18:39
@Simonl              这个我发过了,并且制作了linux版
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 06:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表