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

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

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

2 ответа

Решение

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), так как он никогда не будет обновляться, если все в сценарии идет хорошо.

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

Итак, я собираюсь дать вам программу, которую я написал, потому что у меня были проблемы с работой 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+C).

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

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


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

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

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

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

Скриншот

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

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

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