Чи можна встановити години і піки в vnstat для моніторингу пропускної здатності?


10

Нещодавно я завантажив vnstatдля моніторингу використання своєї пропускної здатності в Інтернеті. У мене обмежений план даних, але мій Інтернет-провайдер забезпечує нерегульовану пропускну здатність у неробочі години (з 02:00 до 8:00 ранку). Отже, я хотів би, щоб vnstat повідомив окремо про використання даних, класифікуючи використання на пікове та поза пікове використання.

Я пройшов, man vnstatале не зміг знайти жодної допомоги в цьому плані. Чи вдасться отримати дві різні статистичні дані за години в пік і поза піком, використовуючи vnstat? Якщо ні, то які альтернативи мені доступні для досягнення цього?


Я написав програму, щоб витягнути цікаві дані з веб-сайту провайдера ; це може бути корисно у вашому випадку, оскільки вони повинні записувати дві ставки окремо. Це використовує PhantomJS для того, щоб викреслити дані про використання. Це трохи альфа, але працює для мене.
півзахисник

@halfer Дякую за посилання .. Хоча я не знаю php / javascript (Infact не знаю багато програмування), я б побачив, чи можу я використати його коли-небудь ... Чому ви не дасте відповіді, використовуючи це утиліта наводить приклад для одного чи двох провайдерів ..., які можуть стати в нагоді для деяких людей .. :)
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+ Cвийти).

Програма працюватиме кожні 15 секунд, щоб побачити, чи збігається час, не надсилатиме жодних повідомлень. Це призначено для запуску на задньому плані. Щойно він запуститься, він зніматиме кожні 15 секунд у вибраному пристрої. Використовуючи команду vnstat, плюс лічильник, який говорить, скільки секунд у вас залишилось від моніторингу.

Після завершення сканування він запитає, чи ви хочете вийти, і дасть вам можливість, якщо ви хочете показати звіт, інакше ви можете просто вийти. Усі речі будь-коли зберігаються в базі даних vnstats.


Стара частина публікації (може бути корисною для деяких людей)

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

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

Інакше я впевнений, що ви можете передати це у файл або скористатися програмою графічного виводу для vnstat, якщо у вас є. Графічна програма виведення vnstati -i 'filename'буде виводити її в png файл. Якщо ви хочете, щоб додаткові команди vnstat --longhelp мали більше команд.

скріншот

(Зразок екрана того, як вкласти речі в графік gnome.)

Чи знаєте ви, як отримати "знімок" пропускної здатності за допомогою vnstat, або вам потрібна додаткова допомога щодо цих команд? Я можу спробувати більше працювати з програмою.


Чому потрібно запитувати у мене весь час пов'язані речі ... Я хочу, щоб він постійно моніторив використання мережі та показував дані окремо за години пік та години піку ... Я хотів би бачити обидва дані щоразу Мені потрібно. Більше того, в цій програмі Python є кілька помилок з відступом ... (я б спробував їх очистити, якщо ви цього не зробите) ...
Aditya

Так, відступи заплуталися на форумі, я мушу проглянути всі речі і додати пробіли, вибачте за це. Я міг би просто розмістити програму py десь напевно. Дозвольте мені також розглянути бази даних для цього.
Немає часу

@Aditya, я переглянув ваше повідомлення про помилку зі сценарію від totti. Ймовірно, вам доведеться запустити його як sudo / root, оскільки файли, до яких звертаються / переміщуються, зазвичай не мають дозволів на рівні користувача. Я б протестував сценарій totti більше, але я не можу вибрати час (або зробити тест зараз), щоб побачити, чи дає мені хороший результат. Мені потрібно було б запустити його близько 8 годин, і я дійсно не хочу так довго чекати. Я не знаю сценарію оболонки, щоб його виправити. якщо ви можете змінити його, щоб встановити, чи працює він, не так важко, це було б круто. (У мене немає відповіді, я не можу коментувати речі інших ppl)
Немає часу,

@totti може бути додати змінний час / час введення користувача?
немає часу
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.