È possibile impostare le ore di punta e non di punta in vnstat per monitorare la larghezza di banda?


10

Ho scaricato di recente vnstatper monitorare l'utilizzo della larghezza di banda di Internet. Ho un piano dati limitato ma il mio ISP fornisce una larghezza di banda illimitata durante le ore non di punta (dalle 2:00 alle 8:00). Quindi, vorrei che vnstat segnalasse l'utilizzo dei dati categorizzando separatamente l'utilizzo non di punta e l'utilizzo non di punta.

Ho attraversato man vnstatma non sono riuscito a trovare alcun aiuto in questo senso. Sarebbe possibile ottenere due diverse statistiche per le ore di punta e non di punta utilizzando vnstat? In caso contrario, quali alternative sono disponibili per ottenere lo stesso?


Ho scritto un programma per estrarre dati interessanti dal sito web dell'ISP ; potrebbe essere utile nel tuo caso, poiché dovrebbero registrare le due tariffe singolarmente. Questo utilizza PhantomJS per raschiare i dati di utilizzo. È un po 'alfa, ma funziona per me.
halfer

@halfer Grazie per il link .. Anche se non conosco php / javascript (infatti non conosco molta programmazione), vedrei se un giorno potrei usarlo ... Perché non dai una risposta usando quello utilità che fornisce un esempio per uno o due ISP ... che potrebbe tornare utile per alcune persone .. :)
Aditya

Nessun problema. Non c'è tempo per scrivere una risposta sostanziale, quindi il commento - ma potrebbe benissimo fare un'altra volta!
halfer

Risposte:


5

AFAIK nessuno strumento di monitoraggio della larghezza di banda è migliore di vnstat. Sfortunatamente non supporta questa funzione. Ma puoi farlo usando più database per vnstat.

Salvare i dati per nelle ore di punta in vnstat1e per le ore non di punta in vnstat2. Crea uno script daemon che li cambierà in base all'ora del giorno usando una ifcondizione in un ciclo infinito; in caso contrario, tra le 02-08 ore utilizzare vnstat1altro disabilita vnstat1, abilita vnstat2e sleep.

Ho scritto il seguente script bash. Salvalo in un file e rendilo eseguibile usando sudo chmod x <filename>. Provalo per qualche tempo. Infine, avvia automaticamente lo script con il sistema operativo. Eseguilo come rootutente. (Basta aggiungere il percorso allo script /etc/rc.localper eseguirlo all'avvio).

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

Passare i=eth0sulla 5a riga all'interfaccia di rete che si desidera monitorare.

Per conoscere l'utilizzo eseguito cat /tmp/onpeake cat /tmp/offpeakrispettivamente.

Inoltre è una buona idea reimpostare i dati sul database predefinito ( /var/lib/vnstat), poiché non verrà mai aggiornato se tutto nello script va bene.



2

Spero che questo aiuti un po '.

Quindi ti darò un programma che ho scritto, perché avevo problemi con cron funzionante. Sfortunatamente non conosco lo scripting della shell, quindi questo è in Python, ma ha funzionato per me ed è piuttosto semplice, ma carino. Mi dispiace non aver commentato il mio codice, ma non volevo davvero ripassarlo. So che alcune parti potrebbero non essere le migliori, ma funziona.

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

Guida veloce

  • Apri Idle, copia> incolla.

  • Salva come filename.py.

  • Terminale aperto.

  • Eseguilo con Python 3 (python3 nomefile.py`).

  • Inserisci l'ora che desideri pianificare per l'esecuzione di vnstat.

  • Inserisci il minuto che desideri di quell'ora.

  • Inserisci il numero di ore che desideri monitorare.

  • Inserisci la quantità di minuti che desideri monitorare.

Inserisci il dispositivo che stai monitorando (non sono passato attraverso e controllo degli errori, quindi se inserisci qualcosa come monkeybutt, proverà ad eseguire vnstat -i monkeybutt, ogni 15 secondi, solo Ctrl+ Cout).

Il programma verrà eseguito ogni 15 secondi per vedere se il tempo corrisponde, non darà alcun messaggio. È pensato per essere eseguito in background. Una volta avviato, eseguirà uno scatto ogni 15 secondi della rete, sul dispositivo scelto. Usando il comando vnstat, più un contatore che dice quanti secondi hai lasciato del monitoraggio.

Dopo aver completato le scansioni ti verrà chiesto se vuoi uscire e ti darà un'opzione se vuoi mostrare un rapporto, altrimenti puoi semplicemente uscire. Tutto il materiale è comunque archiviato nel database vnstats.


Vecchia parte del post (potrebbe essere utile per alcune persone)

Potresti ottenere gnome-schedule, quindi inserire il tuo comando, ad esempio vnstat -h, e impostarlo ripetutamente durante i periodi che stai cercando di monitorare. Forse troppo semplice, ma si spera che qualcun altro possa espandersi ulteriormente.

Aggiuntivo (Modifica): non ho usato vnstat molto, motivo per cui speravo che qualcuno potesse espandersi su quella parte, ma con la pianificazione di gnome, puoi programmare un comando da eseguire durante specifiche parti della giornata. Quindi, usando vntstat -tr -l (interruttore del traffico, monitora il traffico in tempo reale), mostreresti il ​​traffico durante l'esecuzione (che puoi programmare in gnome-schedule, ma potresti dover manualmente Ctrl+ C] out.)

Altrimenti sono sicuro che potresti reindirizzare questo in un file, o utilizzare il programma di output grafico per vnstat se ce l'hai. Il programma di output grafico vnstati -i 'filename'verrà emesso nel file png. Se vuoi ulteriori comandi vnstat --longhelp ha più comandi.

immagine dello schermo

(Schermata di esempio su come inserire le cose nella pianificazione di gnome.)

Sai come ottenere un'istantanea della larghezza di banda usando già vnstat o hai bisogno di ulteriore aiuto su questi comandi? Posso provare a lavorare di più con il programma.


Perché ha bisogno di chiedermi tutto ciò che riguarda il tempo ... Voglio che controlli costantemente l'utilizzo della rete e mostri i dati separatamente per le ore di punta e le ore di punta ... Vorrei vedere entrambi i dati ogni volta Voglio. Inoltre, ci sono un paio di bug di rientro in questo programma Python ... (Proverei a chiarirli se non lo fai nel frattempo) ...
Aditya

Sì, i rientri vengono incasinati sul forum, devo scorrere ogni cosa e aggiungere spazi, mi dispiace. Potrei semplicemente pubblicare il programma PY da qualche parte immagino. Vorrei esaminare anche i database per questo.
No Time

@Aditya, ho visto il tuo messaggio di errore dallo script di totti. Probabilmente dovrai eseguirlo come sudo / root poiché i file a cui si accede / spostato normalmente non dispongono delle autorizzazioni a livello di utente. Vorrei testare di più lo script di Totti, ma non posso selezionare il tempo (o fare un test ora) per vedere se mi sta dando un buon risultato. Avrei bisogno di eseguirlo per circa 8 ore, e davvero non voglio aspettare così tanto. Non conosco abbastanza script di shell per risolverlo. se potessi cambiarlo in modo che non sia così difficile impostare per vedere se funziona, sarebbe bello. (Non ho un rappresentante, non posso commentare cose di altri ppl)
No Time,

@totti forse aggiungi un tempo di input variabile / utente?
No Time
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.