本帖最后由 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秒执行一次
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秒执行一次
|