VPS流量超过一定数量后自动关机脚本
前言
还是阿里国际取消新手套餐引起的
防止流量费用飞起来 :(
步骤
. 创建脚本文件safe.sh
. 然后根据主机商的计费方式,选一种复制进去。
. 赋予执行权限chmod +x safe.sh
. 利用crontab
开机启动safe.sh
crontab -e
@reboot /path/to/safe.sh
. 重启即可
注意!小心!免责!
- 脚本请看看源码的注释,有需要自己修改的地方,比如流量,比如网卡名
- 请测试,请测试,请测试;不一定能在你的主机上允许,请测试后再使用,避免天价账单
- 脚本源自网络收集,种种缘由万一脚本未实现关机,造成的流量账单,绝不负责
双向(流入+流出)计费方式
#!/usr/bin/python3
#coding=utf-8
import sys,re,time,os
maxdata = 100 * 1024 * 1024 * 1024 #流量上限,单位是Byte, 100G
memfilename = '/root/data.txt'
netcard = '/proc/net/dev'
def checkfile(filename):
if os.path.isfile(filename):
pass
else:
f = open(filename, 'w')
f.write('0')
f.close()
def get_net_data():
nc = netcard or '/proc/net/dev'
fd = open(nc, "r")
netcardstatus = False
for line in fd.readlines():
if line.find("ens3") > 0: #这里的网卡用的是ens3,请根据自己的网卡进行调整,可以通过cat /proc/net/dev查看
netcardstatus = True
field = line.split() #读取数据
recv = field[0].split(":")[1]
recv = recv or field[1] #流入流量
send = field[9] #流出流量
if not netcardstatus:
fd.close()
print("Please setup your netcard")
sys.exit()
fd.close()
return (float(recv), float(send))
def net_loop():
(recv, send) = get_net_data()
checkfile(memfilename)
lasttransdaraopen = open(memfilename,'r')
lasttransdata = lasttransdaraopen.readline()
lasttransdaraopen.close()
totaltrans = int(lasttransdata) or 0
while True:
time.sleep(3)
nowtime = time.strftime('%d %H:%M',time.localtime(time.time()))
sec = time.localtime().tm_sec
if nowtime == '01 00:00':
if sec < 10:
totaltrans = 0
(new_recv, new_send) = get_net_data()
recvdata = new_recv - recv
recv = new_recv
senddata = new_send - send
send = new_send
totaltrans += int(recvdata)
totaltrans += int(senddata)
memw = open(memfilename,'w')
memw.write(str(totaltrans))
memw.close()
if totaltrans >= maxdata:
os.system('rm -f /root/data.txt && init 0') #超出流量,删除记录并关机。
if __name__ == "__main__":
net_loop()
单向计费方式
- 如果是流出流量计费,那么把totaltrans += int(recvdata)去掉即可。
- 如果是流入流量计费,那么把totaltrans += int(senddata)去掉即可。
流入流出取最大值计费方式
只要流入、流出任何一个超过了最大值,则关机
#!/usr/bin/python3
#coding=utf-8
import sys,re,time,os
maxdata = 100 * 1024 * 1024 * 1024 #流量上限,包括流入和流出,单位Byte
memfilename = '/root/data.txt'
netcard = '/proc/net/dev'
def checkfile(filename):
if os.path.isfile(filename):
pass
else:
f = open(filename, 'w')
f.write('0\n0\n')
f.close()
def get_net_data():
nc = netcard or '/proc/net/dev'
fd = open(nc, "r")
netcardstatus = False
for line in fd.readlines():
if line.find("ens3") > 0: # 需要cat /proc/net/dev 看看自己的网卡名字,阿里国际是eth0
netcardstatus = True
field = line.split()
recv = field[0].split(":")[1]
recv = recv or field[1]
send = field[9]
if not netcardstatus:
fd.close()
print("Please setup your netcard")
sys.exit()
fd.close()
return (float(recv), float(send))
def net_loop():
(recv, send) = get_net_data()
checkfile(memfilename)
lasttransdata = []
with open(memfilename, 'r') as filehandle:
lasttransdata = [data.rstrip() for data in filehandle.readlines()]
filehandle.close()
print(lasttransdata)
totaltrans = lasttransdata or [0, 0]
while True:
time.sleep(3)
nowtime = time.strftime('%d %H:%M',time.localtime(time.time()))
sec = time.localtime().tm_sec
if nowtime == '01 00:00':
if sec < 10:
totaltrans = [0, 0]
(new_recv, new_send) = get_net_data()
recvdata = new_recv - recv
recv = new_recv
senddata = new_send - send
send = new_send
totaltrans[0] = str(int(totaltrans[0]) + int(recvdata))
totaltrans[1] = str(int(totaltrans[1]) + int(senddata))
#写入数据
with open(memfilename, 'w') as filehandle:
filehandle.writelines("%s\n" % data for data in totaltrans)
filehandle.close()
if int(totaltrans[0]) >= maxdata or int(totaltrans[1]) >= maxdata:
os.system('rm -f /root/data.txt && init 0')
if __name__ == "__main__":
net_loop()
最后修改于 2020-06-20