¿Es posible establecer horas pico y pico en vnstat para monitorear el ancho de banda?


10

Recientemente lo descargué vnstatpara monitorear mi uso de ancho de banda de Internet. Tengo un plan de datos limitado, pero mi ISP proporciona un ancho de banda no medido durante las horas pico (2:00 a.m. a 8:00 a.m.). Por lo tanto, me gustaría que vnstat informe el uso de datos categorizando el uso en horas pico y el uso en horas pico por separado.

He pasado man vnstatpero no pude encontrar ninguna ayuda a este respecto. ¿Sería posible obtener dos estadísticas diferentes para las horas pico y no pico usando vnstat? Si no, ¿qué alternativas tengo disponibles para lograr lo mismo?


Escribí un programa para extraer datos interesantes del sitio web del ISP ; puede ser útil en su caso, ya que deberían registrar las dos tasas individualmente. Esto usa PhantomJS para raspar los datos de uso. Es un poco alfa, pero funciona para mí.
halfer

@halfer Gracias por el enlace ... Aunque no sé php / javascript (de hecho, no sé mucha programación), vería si algún día podría usarlo ... ¿Por qué no das una respuesta usando eso? utilidad que da un ejemplo para uno o dos ISP ... que podría ser útil para algunas personas ... :)
Aditya

No hay problema. No hay tiempo para escribir un atm de respuesta sustancial, de ahí el comentario, ¡pero podría hacerlo en otro momento!
halfer

Respuestas:


5

AFAIK ninguna herramienta de monitoreo de ancho de banda es mejor que vnstat. Lamentablemente no es compatible con esta función. Pero puede lograr esto utilizando múltiples bases de datos para vnstat.

Guarde los datos para las horas pico en vnstat1y para las horas pico en vnstat2. Cree un script de demonio que los cambie según la hora del día utilizando una ifcondición en un bucle infinito; si no es entre las 2 y las 8 horas, use el vnstat1deshabilitar vnstat1, habilitar vnstat2y sleep.

Escribí el siguiente script bash. Guárdelo en un archivo y hágalo ejecutable usando sudo chmod x <filename>. Pruébalo por un tiempo. Finalmente, haga que el script se inicie automáticamente con el sistema operativo. Ejecútelo como el rootusuario. (Solo agregue la ruta al script /etc/rc.localpara que se ejecute en el momento del arranque).

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

Cambie i=eth0en la quinta línea a la interfaz de red que desea monitorear.

Para conocer el uso ejecutar cat /tmp/onpeaky cat /tmp/offpeakrespectivamente.

También es una buena idea restablecer los datos en la base de datos predeterminada ( /var/lib/vnstat), ya que nunca se actualizará si todo en el script funciona bien.



2

Esperemos que esto ayude un poco.

Así que voy a darle un programa que escribí, porque estaba teniendo problemas con el funcionamiento de cron. Desafortunadamente, no conozco los scripts de shell, así que esto está en Python, pero funcionó para mí, y es bastante simple, pero agradable. Lo siento, no comenté mi código, pero realmente no quería volver a leerlo. Sé que algunas partes pueden no ser las mejores, pero funciona.

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

Guía rápida

  • Abra Idle, copie> pegue.

  • Guardar como filename.py.

  • Terminal abierta

  • Ejecútelo con Python 3 (python3 filename.py`).

  • Ingrese la hora que desea programar para que se ejecute vnstat.

  • Pon el minuto que quieras de esa hora.

  • Ponga la cantidad de horas que desea monitorear.

  • Ponga la cantidad de minutos que desea monitorear.

Ingrese el dispositivo que está monitoreando (no lo revisé y la verificación de errores, por lo que si ingresa algo como monkeybutt, intentará ejecutarse vnstat -i monkeybutt, cada 15 segundos, solo Ctrl+ Cfuera).

El programa se ejecutará cada 15 segundos para ver si el tiempo coincide, no dará ningún mensaje. Está destinado a ejecutarse en segundo plano. Una vez que comience, tomará una foto cada 15 segundos de la red, en el dispositivo que elija. Usando el comando vnstat, más un contador que indica cuántos segundos le quedan de monitoreo.

Después de completar los escaneos, le preguntará si desea salir y le dará una opción si desea mostrar un informe; de ​​lo contrario, puede salir. Todo el material se almacena en la base de datos vnstats de todos modos.


Parte anterior de la publicación (puede ser útil para algunas personas)

Puede obtener gnome-schedule, luego poner su comando, por ejemplo, vnstat -h, y configurarlo para que vuelva a ocurrir durante los momentos que está tratando de monitorear. Quizás demasiado simple, pero espero que alguien más pueda expandirse aún más.

Adicional (Editar): no he usado mucho vnstat, por eso esperaba que alguien pudiera expandirse en esa parte, pero con el programa gnome, puede programar un comando para que se ejecute durante partes específicas del día. Por lo tanto, usar vntstat -tr -l (interruptor de tráfico, monitorear el tráfico en vivo), mostraría el tráfico mientras se ejecuta (que puede programar en gnome-schedule, pero puede que tenga que hacer Ctrl+ + manualmente C).

De lo contrario, estoy seguro de que podría canalizar esto en un archivo, o usar el programa de salida gráfica para vnstat si lo tiene. El programa de salida gráfica se vnstati -i 'filename'enviará a un archivo png. Si desea más comandos, vnstat --longhelp tiene más comandos.

captura de pantalla

(Pantalla de muestra de cómo poner las cosas en gnome-schedule).

¿Sabes cómo obtener una 'instantánea' del ancho de banda usando vnstat o necesitas más ayuda con esos comandos? Puedo intentar trabajar más con el programa.


¿Por qué necesita preguntarme todo el tiempo? ... Quiero que monitoree continuamente el uso de la red y muestre datos por separado para las horas pico y las horas pico ... Me gustaría ver los datos siempre que sea Quiero. Además, hay un par de errores de sangría en este programa de Python ... (Mientras tanto, trataría de eliminarlos si no lo hace) ...
Aditya

Sí, las sangrías se estropean en el foro, tengo que revisar cada cosa y agregar espacios, lo siento. Supongo que podría publicar el programa py en algún lugar. Permítanme buscar en las bases de datos para esto también.
No Time

@Aditya, miré tu mensaje de error del script de totti. Probablemente tendrá que ejecutarlo como sudo / root ya que los archivos a los que se accede / mueve normalmente no tienen permisos de nivel de usuario. Probaría más el script de totti, pero no puedo seleccionar el tiempo (o hacer una prueba ahora) para ver si me está dando una buena salida. Necesitaría ejecutarlo durante aproximadamente 8 horas, y realmente no quiero esperar tanto. No conozco el script de shell lo suficiente como para arreglarlo. si pudieras cambiarlo para que no sea tan difícil establecer si funciona, sería genial. (No tengo representante, no puedo comentar sobre las cosas de otras personas)
No Time

¿@totti quizás agregue una variable / tiempo de entrada del usuario?
No Time
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.