VPS流量超过一定数量后自动关机脚本

本文参考:《AWS Lightsail 流量超出自动关机脚本》(来自GLACIER的博客:bvm.me,似乎已经闭站)

原文是以AWS的Lightsail Debian 8.7作为例子,我在原文的基础上,进行了一些补充,分为以下两部分:

  1. 更详细地解释此脚本的代码,如何因应不同的流量计费方式(双向计费方式、单向计费方式、流出流入取最大值的计费方式)
  2. 如何设置开机启动此脚本

脚本代码

双向(流入+流出)计费方式
#!/usr/bin/python3
#coding=utf-8
import sys,re,time,os
maxdata = 858993459200 #流量上限,单位是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')
        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)去掉即可。
流入流出取最大值计费方式

只要流入、流出任何一个超过了最大值,则关机处理,这也是很多人熟知的Vultr的计费方式

#!/usr/bin/python3
#coding=utf-8
import sys,re,time,os
maxdata = 858993459200 #流量上限,包括流入和流出,单位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:
            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()

创建方式是创建一个safe.sh(名字随意,取名safe.sh的意思是让你的账单更安全一点而已😀)。

然后根据你主机商的计费方式,选一种复制进去即可。

然后还要输入以下指令,让这个脚本可以被运行。假设我的safe.sh放在/root底下,那么输入:

chmod +x /root/safe.sh

然后输入这个指令,就可以运行脚本了。

/root/safe.sh

放在其他地方应该也是OK的。

开机启动safe.sh脚本

这里利用的是crontab。非常的简单,输入以下指令:

crontab -e

然后在最后一行加入:

@reboot /root/safe.sh

然后重启一下,你就会发现这个脚本一直在后台运行了。

本人在自己的Vultr主机下测试过,没有大问题。也在upcloud的Ubuntu主机上测试过。不过没有在自然情况下测试过,如果有朋友使用了这个脚本遇到任何问题,也请留言告知我。

你可能还喜欢

发表评论

你的电子邮箱地址不会被公开。被标记*的是你必须填写的。