Можно ли установить часы пиковой и непиковой нагрузки в vnstat для мониторинга пропускной способности?

Я недавно загрузил vnstat для мониторинга использования моей пропускной способности Интернет. У меня ограниченный тариф на передачу данных, но мой интернет-провайдер обеспечивает неограниченную пропускную способность в непиковые часы (с 2:00 до 8:00). Итак, я хотел бы, чтобы vnstat сообщал об использовании данных, классифицируя пиковое использование и непиковое использование отдельно.

Я прошел man vnstat, но не смог найти никакой помощи в этом отношении. Можно ли получить две разные статистические данные за часы пиковой и непиковой нагрузки, используя vnstat? Если нет, то какие альтернативы мне доступны для достижения того же самого?

10
задан 7 April 2014 в 15:49

2 ответа

AFAIK никакой контрольный инструмент пропускной способности лучше, чем vnstat. К сожалению, это не поддерживает эту функцию. Но можно достигнуть этого при помощи нескольких баз данных для vnstat.

Сохраните данные для на часах пик к vnstat1 и для непикового к vnstat2. Сделайте сценарий демона, который переключит их на основе времени дня с помощью if условие в бесконечном цикле; если не между использованием 02-08 часов vnstat1 еще отключите vnstat1, включить vnstat2 и sleep.

Я записал следующий сценарий удара. Сохраните его в файле и сделайте его исполняемым использованием sudo chmod x <filename>. Тестируйте его в течение некоторого времени. Наконец сделайте автоматический запуск сценария с ОС. Выполните его как 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/onpeak и cat /tmp/offpeak соответственно.

Также это - хорошая идея сбросить данные по базе данных по умолчанию (/var/lib/vnstat), поскольку это никогда не будет обновлять, если все в сценарии будет подходить.

5
ответ дан 7 April 2014 в 15:49

Надо надеяться, это помогает немного.

Таким образом, я собираюсь дать Вам программу, я записал, потому что у меня были проблемы с работой крона. Я не знаю оболочку, пишущую сценарий, к сожалению, таким образом, это находится в 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()              

Краткое руководство по

  • Откройте Idle, копия> вставка.

  • Save as filename.py.

  • Откройте Terminal.

  • Выполните его с Python 3 (python3 filename.py').

  • Вставьте час, который Вы хотите запланировать, чтобы vnstat работал.

  • Вставьте минуту, которую Вы хотите того часа.

  • Поместите сумму часов, для которых Вы хотите, чтобы она контролировала.

  • Поместите сумму минут, для которых Вы хотите, чтобы она контролировала.

Введите устройство, которое Вы контролируете (я не прошел и проверка на ошибки, поэтому если Вы введете что-то как monkeybutt, то это попытается работать vnstat -i monkeybutt, каждые 15 секунд, просто Ctrl+C).

Программа будет пробегать каждые 15 секунд, чтобы видеть, соответствует ли время, она не даст сообщений. Это предназначено, чтобы быть выполненным в фоновом режиме. После того как это запускается, это сделает снимок каждые 15 секунд сети, на устройстве Вы выбрали. Используя команду vnstat, плюс счетчик, говорящий, сколько секунд Вы уехали контроля.

После завершения сканирований это спросит, хотите ли Вы выйти, и дать Вам опцию, если Вы хотите показать отчет, иначе можно просто выйти. Весь материал хранится в vnstats базе данных так или иначе.


Старая часть сообщения (может быть полезно некоторым людям),

Вы могли получить расписание гнома, затем вставить Вашу команду, например, vnstat-h и установить его повторяющийся в течение времен, которые Вы пытаетесь контролировать. Возможно, слишком простой, но надо надеяться кто-то еще мог расшириться далее.

Дополнительный (Редактирование): Я не использовал vnstat очень, который является, почему я надеялся, что кто-то мог подробно остановиться на той части, но с расписанием гнома, можно запланировать команду для выполнения во время определенных частей дня. Так с помощью vntstat - TR-l (переключение трафика, монитор живой трафик), показал бы трафик при выполнении (который можно запланировать в расписании гнома, но Вы можете иметь к вручную Ctrl+C].)

Иначе я уверен, что Вы могли передать это по каналу в файл или использовать программу вывода графических данных для vnstat, если у Вас есть это. Программа вывода графических данных vnstati -i 'filename' произведет его в png файл. Если Вы хотите дальнейшие команды vnstat --longhelp имеет больше команд.

screenshot

(Демонстрационный экран того, как поместить вещи в расписание гнома.)

Вы знаете, как уже получить 'снимок' пропускной способности с помощью vnstat, или Вы нуждаетесь в дальнейшей помощи на тех командах? Я могу попытаться работать с программой больше.

2
ответ дан 7 April 2014 в 15:49

Другие вопросы по тегам:

Похожие вопросы: