Czy w vnstat można ustawić godziny szczytu i poza szczytem w celu monitorowania przepustowości?

10

Niedawno pobrałem, vnstataby monitorować wykorzystanie przepustowości Internetu. Mam ograniczony pakiet danych, ale mój dostawca usług internetowych zapewnia niezmierzone pasmo poza godzinami szczytu (od 2:00 do 8:00). Chciałbym więc, aby vnstat osobno raportował wykorzystanie danych, kategoryzując wykorzystanie szczytowe i poza szczytowe.

Przeszedłem, man vnstatale nie mogłem znaleźć pomocy w tym zakresie. Czy byłoby możliwe uzyskanie dwóch różnych statystyk dla godzin szczytu i poza nim vnstat? Jeśli nie, jakie alternatywy są dla mnie dostępne?

Aditya
źródło
Napisałem program do wyciągania interesujących danych ze strony internetowej dostawcy usług internetowych ; może to być przydatne w twoim przypadku, ponieważ powinny rejestrować dwie stawki indywidualnie. To wykorzystuje PhantomJS do zeskrobywania danych użytkowania. To trochę alfa, ale działa dla mnie.
halfer
@halfer Dzięki za link .. Chociaż nie znam php / javascript (w rzeczywistości nie znam się na programowaniu), sprawdziłbym, czy kiedyś mógłbym z niego skorzystać ... Dlaczego nie udzielisz odpowiedzi używając tego? narzędzie podające przykład dla jednego lub dwóch dostawców usług internetowych ... które mogą się przydać niektórym osobom .. :)
Aditya
Nie ma problemu. Nie ma czasu na napisanie rzetelnej odpowiedzi w bankomacie, stąd komentarz - ale równie dobrze może zrobić to innym razem!
halfer

Odpowiedzi:

5

AFAIK żadne narzędzie do monitorowania przepustowości nie jest lepsze niż vnstat. Niestety nie obsługuje tej funkcji. Ale możesz to osiągnąć, używając wielu baz danych dla vnstat.

Zapisz dane dla godzin szczytu do vnstat1i poza szczytem do vnstat2. Stwórz skrypt demona, który będzie je przełączał w zależności od pory dnia, używając ifwarunku w nieskończonej pętli; jeśli nie między 02-08 godzin, użyj vnstat1innego wyłącz vnstat1, włącz vnstat2i sleep.

Napisałem następujący skrypt bash. Zapisz go w pliku i uruchom za pomocą sudo chmod x <filename>. Przetestuj to przez jakiś czas. Na koniec uruchom skrypt automatycznie uruchamiany w systemie operacyjnym. Uruchom jako rootużytkownik. (Wystarczy dodać ścieżkę do skryptu /etc/rc.local, aby można go było wykonać podczas rozruchu).

#!/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`

Zmień i=eth05 linię na interfejs sieciowy, który chcesz monitorować.

Aby dowiedzieć się wykorzystanie uruchomić cat /tmp/onpeaki cat /tmp/offpeakodpowiednio.

Warto też zresetować dane w domyślnej bazie danych ( /var/lib/vnstat), ponieważ nigdy się nie zaktualizuje, jeśli wszystko w skrypcie pójdzie dobrze.

Totti
źródło
2

Mam nadzieję, że to trochę pomoże.

Dam ci więc program, który napisałem, ponieważ miałem problemy z działaniem crona. Niestety nie znam skryptów powłoki, więc jest to w Pythonie, ale zadziałało dla mnie i jest dość proste, ale miłe. Przepraszam, że nie skomentowałem mojego kodu, ale tak naprawdę nie chciałem go przeglądać. Wiem, że niektóre części mogą nie być najlepsze, ale działa.

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()              

Szybka porada

  • Otwórz Idle, skopiuj> wklej.

  • Zapisz jako filename.py.

  • Otwórz terminal.

  • Uruchom go z Python 3 (python3 nazwa_pliku.py`).

  • Wprowadź godzinę, o której chcesz zaplanować uruchomienie vnstat.

  • Wprowadź minutę, którą chcesz o tej godzinie.

  • Podaj liczbę godzin, które chcesz monitorować.

  • Podaj liczbę minut, którą chcesz monitorować.

Wprowadź monitorowane urządzenie (nie przeszedłem i nie sprawdziłem błędów, więc jeśli wpiszesz coś w rodzaju monkeybutt, będzie on próbował uruchomić się vnstat -i monkeybuttco 15 sekund, po prostu Ctrl+ Cout).

Program będzie działał co 15 sekund, aby sprawdzić, czy czas się zgadza, nie będzie wysyłał żadnych komunikatów. Ma być uruchamiany w tle. Gdy zacznie się, co 15 sekund z sieci zrobi zdjęcie na wybranym urządzeniu. Za pomocą polecenia vnstat oraz licznika informującego, ile sekund pozostało do monitorowania.

Po zakończeniu skanowania zapyta, czy chcesz wyjść, i wyświetli opcję, jeśli chcesz pokazać raport, w przeciwnym razie możesz po prostu wyjść. Wszystkie rzeczy są przechowywane w bazie danych vnstats.


Stara część postu (może być pomocna dla niektórych osób)

Możesz dostać gnome-schedule, a następnie wprowadzić polecenie na przykład vnstat -h i ustawić, aby powracało w czasie, gdy próbujesz monitorować. Może zbyt proste, ale miejmy nadzieję, że ktoś inny może dalej się rozwijać.

Dodatkowe (Edycja): Nie używałem zbyt wiele vnstat, dlatego miałem nadzieję, że ktoś może rozwinąć tę część, ale dzięki harmonogramowi gnome możesz zaplanować wykonanie polecenia w określonych częściach dnia. Tak więc użycie vntstat -tr -l (zmiana ruchu, monitorowanie ruchu na żywo), pokazywałoby ruch podczas pracy (co można zaplanować w harmonogramie gnome, ale może być konieczne ręczne Ctrl+ C].)

W przeciwnym razie jestem pewien, że możesz to potokować do pliku lub użyć graficznego programu wyjściowego dla vnstat, jeśli go masz. Graficzny program wyjściowy vnstati -i 'filename'wyśle ​​go do pliku png. Jeśli chcesz więcej poleceń, vnstat --longhelp ma więcej poleceń.

zrzut ekranu

(Przykładowy ekran wprowadzania rzeczy do harmonogramu gnome.)

Czy wiesz już, jak uzyskać „migawkę” przepustowości za pomocą vnstat, czy potrzebujesz dalszej pomocy w zakresie tych poleceń? Mogę spróbować więcej pracować z programem.

Brak czasu
źródło
Dlaczego musi mnie cały czas pytać ... Chcę, aby stale monitorował wykorzystanie sieci i wyświetlał dane osobno dla godzin szczytu i poza godzinami szczytu ... Chciałbym widzieć oba dane za każdym razem Chcę. Co więcej, w tym programie Python jest kilka błędów wcięć ... (Spróbowałbym je usunąć, jeśli tymczasem tego nie zrobisz) ...
Aditya
Tak, wcięcia są pomieszane na forum, muszę wszystko przejrzeć i dodać spacje, przepraszam za to. Chyba mógłbym po prostu opublikować program py. Pozwól, że sprawdzę również bazy danych.
No Time
@Aditya, spojrzałem na twój komunikat o błędzie ze skryptu autorstwa totti. Prawdopodobnie będziesz musiał uruchomić go jako sudo / root, ponieważ pliki, do których uzyskiwany jest dostęp / przenoszenie, zwykle nie mają uprawnień na poziomie użytkownika. Testowałbym więcej skryptu totti, ale nie mogę wybrać czasu (ani zrobić testu teraz), aby zobaczyć, czy daje mi to dobry wynik. Musiałbym go uruchomić przez około 8 godzin i naprawdę nie chcę czekać tak długo. Nie znam wystarczającego skryptu powłoki, aby go naprawić. jeśli możesz to zmienić, aby nie było tak trudno ustawić, czy to działa, byłoby fajnie. (Nie mam przedstawiciela, nie mogę komentować rzeczy innych ppl)
No Time
@totti może dodać zmienną / czas wprowadzania danych przez użytkownika?
No Time