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

10

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

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

Адитья
источник
Я написал программу для извлечения интересных данных с сайта провайдера ; это может быть полезно в вашем случае, так как они должны регистрировать две ставки по отдельности. Это использует PhantomJS для очистки данных об использовании. Это немного альфа, но у меня работает.
организатор
@ halfer Спасибо за ссылку. Хотя я не знаю php / javascript (на самом деле, я не очень разбираюсь в программировании), посмотрел бы, смогу ли я когда-нибудь им воспользоваться ... Почему бы вам не дать ответ, используя это? утилита, дающая пример для одного или двух интернет-провайдеров ... которые могут пригодиться некоторым людям .. :)
Aditya
Нет проблем. Нет времени, чтобы написать содержательный ответ, и, следовательно, комментарий - но вполне может сделать в другой раз!
Гольфист

Ответы:

5

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

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

Я написал следующий скрипт bash. Сохраните его в файл и сделайте его исполняемым с помощью 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), поскольку она никогда не будет обновляться, если все в сценарии выполнено правильно.

Тотти
источник
2

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

Поэтому я собираюсь дать вам программу, которую я написал, потому что у меня были проблемы с работой cron. К сожалению, я не знаю сценариев оболочки, так что это на 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+ Cout).

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

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


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

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

Дополнительно (Правка): я не очень часто использовал vnstat, поэтому я надеялся, что кто-то сможет расширить эту часть, но с помощью gnome-schedule вы можете запланировать выполнение команды в определенные части дня. Поэтому использование vntstat -tr -l (переключатель трафика, мониторинг трафика в реальном времени) покажет трафик во время работы (который вы можете запланировать в gnome-schedule, но вам, возможно, придется вручную Ctrl+ C] выйти.)

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

снимок экрана

(Пример экрана, как поместить вещи в гном-расписание.)

Знаете ли вы, как получить «снимок» полосы пропускания с помощью vnstat, или вам нужна дополнительная помощь по этим командам? Я могу попытаться работать с программой больше.

Нет времени
источник
Почему он должен спрашивать меня все время связанные вещи ... Я хочу, чтобы он постоянно отслеживал использование сети и отображал данные отдельно для часов пик и часов пик ... Я хотел бы видеть обе эти данные всякий раз, когда Я хочу. Более того, в этой программе на Python есть несколько ошибок, связанных с отступами ... (Я бы постарался их устранить, если вы не сделаете это за это время) ...
Aditya
Да, отступы запутались на форуме, я должен пробежаться по всем вещам и добавить пробелы, извините за это. Я мог бы просто опубликовать программу py где-нибудь, я думаю. Позвольте мне посмотреть базы данных для этого.
Нет времени
@Aditya, я посмотрел на твое сообщение об ошибке из скрипта по Тотти. Вероятно, вам придется запускать его как sudo / root, так как файлы, к которым осуществляется доступ / перемещение, обычно не имеют прав на уровне пользователя. Я бы протестировал скрипт Тотти больше, но я не могу выбрать время (или сделать тест сейчас), чтобы посмотреть, дает ли он хороший результат. Мне нужно было бы запустить его около 8 часов, и я действительно не хочу ждать так долго. Я не знаю сценарий оболочки достаточно, чтобы исправить это. если бы вы могли изменить его, чтобы не было так сложно установить, работает ли он, это было бы здорово. (У меня нет представителя, я не могу комментировать материал других пользователей)
Нет времени
Может быть, @totti добавить время ввода переменной / пользователя?
Без времени