是否可以在vnstat中设置高峰时段和非高峰时段来监视带宽?


10

我最近下载vnstat了监视我的Internet带宽使用情况。我的数据计划有限,但是我的ISP在非高峰时间(2:00 AM至8:00 AM)提供未测量的带宽。因此,我希望vnstat分别报告高峰使用和非高峰使用的数据使用情况。

我已经经历了,man vnstat但是在这方面找不到任何帮助。是否可以使用高峰时间和非高峰时间获得两个不同的统计信息vnstat?如果没有,我有哪些替代方法可以实现相同目标?


我编写了一个程序,以从ISP的网站中提取有趣的数据;这可能对您有用,因为他们应该分别记录两个比率。这使用PhantomJS抓取用法数据。它有点alpha,但是对我有用。
Halfer 2014年

@halfer感谢您的链接。.尽管我不了解php / javascript(实际上并不了解太多编程),但是有一天会看看我是否可以使用它……您为什么不给出答案呢?实用程序为一个或两个ISP提供示例...对于某些人来说可能会派上用场.. :)
Aditya 2014年

没有问题。没有时间写一个重要的答案atm,因此发表评论-但很可能再做一次!
Halfer 2014年

Answers:


5

AFAIK没有带宽监视工具胜过vnstat。不幸的是,它不支持此功能。但是您可以通过使用多个数据库来实现此目的vnstat

将高峰时段vnstat1和非高峰时段的数据保存到vnstat2。创建一个守护程序脚本,该脚本将使用if无限循环中的条件根据一天中的时间切换它们;如果不在02-08小时之间,请使用vnstat1else禁用vnstat1,启用vnstat2sleep

我写了以下bash脚本。将其保存在文件中,并使用使其可执行sudo chmod x <filename>。测试一段时间。最后,使脚本自动从OS启动。以root用户身份运行。(只需在脚本中添加路径/etc/rc.local,使其在引导时执行即可)。

#!/bin/bash
# vnstat_switcher.sh

# Select the interface to monitor e.g: eth0, eth1, ppp0
i=eth0

# Location of database used by vnstat
db1='/var/lib/vnstat1'   # on-peak
db2='/var/lib/vnstat2'   # off-peak

onpeakdb='/tmp/onpeak'
offpeakdb='/tmp/offpeak'

debug=false
iscatdata=true
current=0

# Create database for db1 if it doesn't exist
if ! [ -d "$db1" ]
    then
    mkdir -p "$db1"
    vnstat -i $i --dbdir "$db1" -u
fi

# Create database for db2 if it doesn't exist
if ! [ -d "$db2" ]
    then
    mkdir -p "$db2"
    vnstat -i $i --dbdir "$db2" -u
fi

$debug && echo 1
#vnstat -i $i --disable

while true
    do
    t=$( date  %H )
    $debug && t=$( date  %S )
    if [ "$t" -lt 2 ] || [ "$t" -gt 7 ]    # if peak hours
        then
        $debug && echo 'On-peak hours'
        vnstat -i $i --dbdir "$db1" -u
        $debug && echo 2
        if [ "$iscatdata" ]
            then
            vnstat -i $i --dbdir "$db2" > "$offpeakdb"
            iscatdata=false
        fi
        vnstat -i $i --dbdir "$db1" > "$onpeakdb"
        if [ $current != 1 ]
            then
            vnstat -i $i --disable --dbdir "$db2"
            $debug && echo 3
            vnstat -i $i --enable --dbdir "$db1" --sync
            $debug && echo 4
            current=1
        fi
    else
        $debug &&  echo 'Off-peak hours'
        vnstat -i $i --dbdir "$db2" -u
        $debug && echo 5
        if [ "$iscatdata" ]
            then
            vnstat -i $i --dbdir "$db1" > "$onpeakdb"
            iscatdata=false
        fi
        vnstat -i $i --dbdir "$db2" > "$offpeakdb"
        if [ $current != 2 ]
            then
            vnstat -i $i --disable --dbdir "$db1"
            $debug && echo 6
            vnstat -i $i --enable --dbdir "$db2" --sync
            $debug && echo 7
            current=2
        fi
    fi
    $debug && sleep 1 || sleep 1m
    done


#### Notes
# Ignore this message at first execution
# Interface "lo" is already disabled.
# Interface "lo" is already enabled.

#For debugging use interface 'lo' then
# `ping -s 2222 0.0.0.0`

i=eth0在第5行更改为要监视的网络接口。

要知道用法cat /tmp/onpeakcat /tmp/offpeak分别运行。

重置默认数据库(/var/lib/vnstat)上的数据也是一个好主意,因为如果脚本中的所有内容运行正常,它将永远不会更新。



2

希望这会有所帮助。

因此,我将为您提供我编写的程序,因为我在使用cron时遇到问题。不幸的是,我不知道shell脚本,所以这是在python中,但是它对我有用,而且很简单,但是很好。抱歉,我没有注释我的代码,但是我真的不想返回它。我知道某些部分可能不是最好的,但它可以工作。

def main():    
    while True:
        import time
        import os
        from subprocess import call
        schedule=tim3()
        print(schedule)
        interface=" "
        while interface==" ":

            interface=input("""
Enter your interface:
(Be careful there is no error checking for this part)
Examples are eth0, wlan0...
""")
            if interface == "":
                break

        while True:
            x= clogger(schedule[2],schedule[3],schedule[4],\
                   schedule[5],interface)

            if x== "done":
                break
        while True:
            x= exit_q()
            if x== "y":
                user_exit=input('''
How would you like your output?
Type (From vnstat --longhelp):
     q,  --query          query database
     h,  --hours          show hours
     d,  --days           show days
     m,  --months         show months
     w,  --weeks          show weeks
     t,  --top10          show top10
     s,  --short          use short output
''')
                call(["vnstat", "-"+str(user_exit), "-i", str(interface),])
            break
        break



def tim3():
    import time

    #current_time=["16", "20"]
    tim3= time.strftime("%H %M")
    current_time=tim3.split()
    print("""


        """+ str(tim3)+"""
        Current time
        """)
    hour=current_time[0]
    minute=current_time[1]
    ui = inputs()
    newlist=[hour, minute]
    schedule=newlist+ui
    print(schedule)
    return schedule
def inputs():
    print("""
------------------------------------------
""")
    while True:
        start_hour=(input("Enter the starting hour (24hr): "))
        start_min=(input("Enter the starting minute: "))
        x = checker(start_hour, start_min)
        endh=(input("How many hours would you like to run? "))
        endm=(input("How many minutes would you like to run? "))
        y = checker(endh,endm)
        if str(x)=="Great":
            if str(y) == "Great":
                return [start_hour, start_min, endh, endm]

def checker(h,m):
    error=0
    message=("Incorrect Format")
    while error==0:
        if h =="":
            print(message)
            break
        if len(str(h))> 2:
            print(message)
            break
        if m =="":
            print(message)
            break
        if len(str(m))>2:
            print(message)
            break
        for x in str(h):
            if x.isdigit() == False:
                error+=1
                print(message)
                break
            if error>0:     
                print(message)
                break
        for y in str(m):
            if y.isdigit() == False:
                error+=1
                print(message)
                break
            if error>0:     
                print(message)
                break
        else:
            return("Great")

def clogger(s1,s2,t1,t2,I):
    import time
    import os
    from subprocess import call
    total_time=int(t1)*60*60+int(t2)*60


    while True:
        h1=int(time.strftime('%H'))
        m2=int(time.strftime('%M'))
        if len(str(s1))<2:
            s1="0"+str(s1)

        if len(str(s2))<2:
            s2="0"+str(s2)

        if len(str(h1))<2:
            h1="0"+str(h1)

        if str(h1)==str(s1) and str(m2)==str(s2):
            while True:
                if total_time>0:

                    call (["vnstat", "-i",str(I)])
                    time.sleep(15)
                    total_time=total_time-15
                    print(total_time," seconds")

                elif total_time<=0:
                    return "done"

        time.sleep(15)




def exit_q():

    while True:
        question=input("Would you like to show a report? (y/n) ")
        if question == "y" or question == "n":
            return question



main()              

快速指南

  • 打开空闲,复制>粘贴。

  • 另存为filename.py

  • 打开终端。

  • 使用Python 3(python3 filename.py`)运行它。

  • 输入您要安排vnstat运行的时间。

  • 输入您想要的那一分钟。

  • 输入您要监视的小时数。

  • 输入您要监视的分钟数。

输入您正在监视的设备(我没有经过并进行错误检查,因此,如果您输入诸如monkeybutt之类的设备,它将vnstat -i monkeybutt每隔15秒尝试运行一次,只需Ctrl+即可C)。

该程序将每15秒运行一次,以查看时间是否匹配,它不会发出任何消息。它应在后台运行。一旦启动,它将在您选择的设备上每15秒拍摄一次网络。使用vnstat命令,再加上一个计数器,说您还剩多少秒需要监视。

完成扫描后,它将询问您是否要退出,并为您提供一个选项以显示报告,否则就可以退出。无论如何,所有的东西都存储在vnstats数据库中。


帖子的旧部分(可能对某些人有帮助)

您可以获取gnome计划,然后输入命令,例如vnstat -h,并在您尝试监视的时间内将其设置为重复发生。也许太简单了,但是希望其他人可以进一步扩展。

Additional(Edit):我没有使用vnstat太多,这就是为什么我希望有人可以在该部分进行扩展,但是有了gnome计划,您可以计划在一天的特定时间执行的命令。因此,使用vntstat -tr -l(流量开关,监视实时流量)将在运行时显示流量(您可以在gnome-schedule中进行计划,但可能需要手动Ctrl+ C]来进行。)

否则,我确定您可以将其通过管道传输到文件中,或者将图形输出程序用于vnstat(如果有)。图形输出程序vnstati -i 'filename'将输出到png文件。如果您想要更多的命令,vnstat --longhelp还有更多的命令。

屏幕截图

(如何将内容放入gnome时间表的示例屏幕。)

您是否已经知道如何使用vnstat来获取带宽的“快照”,或者您需要这些命令的进一步帮助?我可以尝试使用该程序。


为什么它需要一直问我所有与时间相关的问题...我希望它持续监视网络使用情况,并在高峰时段和非高峰时段分别显示数据...我希望在任何时候都可以看到这两个数据我想要。此外,此Python程序中还有一些缩进错误...(如果您同时不这样做,我会尝试清除它们)...
Aditya 2014年

是的,缩进在论坛上弄乱了,我必须仔细检查所有内容并添加空格,对此感到抱歉。我可以将py程序发布到我猜的某个地方。让我也为此研究数据库。
No Time

@Aditya,我查看了totti脚本中的错误消息。您可能必须以sudo / root身份运行它,因为被访问/移动的文件通常没有用户级权限。我会更多地测试totti的脚本,但是我无法选择时间(或现在进行测试)来查看它是否为我提供了良好的输出。我将需要运行大约8个小时,并且真的不想等待那么长时间。我对shell脚本的了解不足以对其进行修复。如果您可以更改它,这样就不难确定它是否起作用了,那就太好了。(我没有代表,我无法对其他人民解放军的东西发表评论)
没时间

@totti可能会添加一个变量/用户输入时间?
No Time
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.