É possível configurar horários de pico e fora de pico no vnstat para monitorar a largura de banda?

10

Eu baixei recentemente o vnstat para monitorar meu uso da largura de banda da Internet. Eu tenho um plano de dados limitado, mas o meu provedor fornece largura de banda não monitorada durante os horários de pico (2:00 às 8:00). Então, eu gostaria que o vnstat relatasse o uso de dados categorizando o uso no pico e o uso fora do pico separadamente.

Eu passei por man vnstat , mas não encontrei ajuda nesse sentido. Seria possível obter duas estatísticas diferentes para horas de pico e fora de pico usando vnstat ? Se não, que alternativas estão disponíveis para eu conseguir o mesmo?

    
por Aditya 17.03.2014 / 16:07

2 respostas

5

AFAIK nenhuma ferramenta de monitoramento de largura de banda é melhor que vnstat . Infelizmente não suporta este recurso. Mas você pode conseguir isso usando vários bancos de dados para vnstat .

Salve os dados das horas de pico em vnstat1 e fora de pico em vnstat2 . Crie um script daemon que os alterne com base na hora do dia usando uma condição if em um loop infinito; se não entre 02-08 horas use vnstat1 else desabilitar vnstat1 , habilitar vnstat2 e sleep .

Eu escrevi o seguinte script bash. Salve-o em um arquivo e torne-o executável usando sudo chmod x <filename> . Teste isso por algum tempo. Finalmente, faça o script iniciar automaticamente com o sistema operacional. Execute-o como o usuário root . (Basta adicionar o caminho para o script em /etc/rc.local para que ele seja executado no momento da inicialização).

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

Altere i=eth0 na quinta linha para a interface de rede que você deseja monitorar.

Para saber o uso, execute cat /tmp/onpeak e cat /tmp/offpeak , respectivamente.

Além disso, é uma boa ideia redefinir os dados no banco de dados padrão ( /var/lib/vnstat ), pois ele nunca será atualizado se tudo no script for bem.

    
por totti 06.04.2014 / 16:29
2

Espero que isso ajude um pouco.

Então eu vou te dar um programa que eu escrevi, porque eu estava tendo problemas com o cron trabalhando. Eu não sei script de shell, infelizmente, isso é em python, mas funcionou para mim, e é bastante simples, mas agradável. Desculpe eu não comentei o meu código, mas eu realmente não queria voltar por isso. Eu sei que algumas partes podem não ser as melhores, mas 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()              

Guia rápido

  • Abra Ocioso, copie > cole.

  • Salvar como filename.py .

  • Abra o Terminal.

  • Execute-o com o Python 3 (python3 filename.py ').

  • Coloque na hora que você deseja agendar para que o vnstat seja executado.

  • Coloque no minuto que você quer daquela hora.

  • Coloque a quantidade de horas que você deseja monitorar.

  • Coloque a quantidade de minutos que você deseja monitorar.

Digite o dispositivo que você está monitorando (eu não passei pela verificação de erros, por isso, se você digitar algo como monkeybutt, ele tentará executar vnstat -i monkeybutt , a cada 15 segundos, apenas Ctrl + C para fora).

O programa será executado a cada 15 segundos para ver se a hora coincide, não dará nenhuma mensagem. Está destinado a ser executado em segundo plano. Uma vez iniciado, ele fará uma captura a cada 15 segundos da rede, no dispositivo que você escolheu. Usando o comando vnstat, mais um contador dizendo quantos segundos você deixou de monitorar.

Depois de concluir as verificações, ele perguntará se você deseja sair e fornecerá uma opção se quiser mostrar um relatório. Caso contrário, você pode simplesmente sair. Todas as coisas são armazenadas no banco de dados do vnstats de qualquer maneira.

Parte antiga do post (pode ser útil para algumas pessoas)

Você pode obter o gnome-schedule, em seguida, colocar o seu comando, por exemplo, vnstat -h, e configurá-lo novamente durante os horários que você está tentando monitorar. Talvez seja simples demais, mas espero que alguém mais se expanda.

Adicional (Edit): Eu não usei muito o vnstat, e é por isso que eu esperava que alguém pudesse expandir essa parte, mas com o gnome-schedule, você pode programar um comando para executar durante partes específicas do dia. Portanto, usando vntstat -tr -l (comutador de tráfego, monitorar tráfego ao vivo), mostraria o tráfego durante a execução (que você pode programar no gnome-schedule, mas pode ser necessário manualmente Ctrl + C ].

Caso contrário, eu tenho certeza que você poderia canalizar isso em um arquivo, ou usar o programa gráfico de saída para o vnstat se você tiver isso. O programa gráfico de saída é vnstati -i 'filename' e será enviado para o arquivo png. Se você quiser mais comandos vnstat --longhel p tem mais comandos.

(Exemplo de tela de como colocar coisas no gnome-schedule.)

Você já sabe como obter um 'instantâneo' da largura de banda usando o vnstat ou precisa de mais ajuda sobre esses comandos? Eu posso tentar trabalhar mais com o programa.

    
por No Time 09.04.2014 / 08:13