É possível definir horas de pico e fora de pico no vnstat para monitorar a largura de banda?

10

Recentemente, baixei vnstatpara monitorar meu uso da largura de banda da Internet. Eu tenho um plano de dados limitado, mas meu ISP fornece largura de banda não medida durante o horário de pico (2:00 às 8:00). Portanto, eu gostaria que o vnstat relate o uso de dados categorizando o uso dentro e fora do pico separadamente.

Passei, man vnstatmas não consegui encontrar nenhuma ajuda a esse respeito. Seria possível obter duas estatísticas diferentes para os horários de pico e fora de pico usando vnstat? Caso contrário, que alternativas estão disponíveis para eu conseguir o mesmo?

Aditya
fonte
Eu escrevi um programa para extrair dados interessantes do site do ISP ; pode ser útil no seu caso, pois eles devem registrar as duas taxas individualmente. Isso usa o PhantomJS para raspar os dados de uso. É um pouco alfa, mas funciona para mim.
halfer
@halfer Obrigado pelo link .. Embora eu não conheça php / javascript (de fato, não conheço muita programação), verificaria se eu poderia usá-lo algum dia ... Por que você não dá uma resposta usando isso utility dando um exemplo para um ou dois ISPs ... que pode vir a calhar para algumas pessoas .. :)
Aditya
Sem probs. Não há tempo para escrever uma resposta substancial para o caixa eletrônico, daí o comentário - mas pode muito bem fazer outra hora!
halfer

Respostas:

5

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

Salve os dados nos horários de pico vnstat1e fora dos horários de pico vnstat2. Crie um script daemon que os alterne com base na hora do dia usando uma ifcondição em um loop infinito; se não estiver entre as 02-08 horas, use vnstat1else disable vnstat1, enable vnstat2e sleep.

Eu escrevi o seguinte script bash. Salve-o em um arquivo e torne-o executável usando sudo chmod x <filename>. Teste por algum tempo. Por fim, faça o script iniciar automaticamente com o SO. Execute-o como rootusuário. (Basta adicionar o caminho ao script /etc/rc.localpara 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`

Mude i=eth0na 5ª linha para a interface de rede que você deseja monitorar.

Para conhecer o uso, execute cat /tmp/onpeake cat /tmp/offpeakrespectivamente.

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

totti
fonte
2

Espero que isso ajude um pouco.

Então, eu vou lhe dar um programa que escrevi, porque estava tendo problemas com o cron funcionando. Infelizmente, eu não conheço scripts de shell, então isso está em python, mas funcionou para mim e é bem simples, mas agradável. Desculpe por não comentar o meu código, mas realmente não queria voltar a usá-lo. 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.

  • Terminal aberto.

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

  • Coloque a hora em que você deseja agendar a execução do vnstat.

  • Ponha no minuto que você quer daquela hora.

  • Coloque a quantidade de horas que deseja monitorar.

  • Coloque a quantidade de minutos que deseja monitorar.

Digite o dispositivo que você está monitorando (eu não passei por uma verificação de erro; portanto, se você digitar algo como monkeybutt, ele tentará executar vnstat -i monkeybutt, a cada 15 segundos, apenas Ctrl+ Csair).

O programa será executado a cada 15 segundos para verificar se o horário corresponde e não enviará nenhuma mensagem. É para ser executado em segundo plano. Uma vez iniciado, a tomada é capturada a cada 15 segundos da rede, no dispositivo que você escolheu. Usando o comando vnstat, além de um contador dizendo quantos segundos você deixou de monitorar.

Depois de concluir as varreduras, ele perguntará se você deseja sair e oferece uma opção para exibir um relatório, caso contrário, você pode simplesmente sair. Todo o material é armazenado no banco de dados vnstats de qualquer maneira.


Parte antiga da postagem (pode ser útil para algumas pessoas)

Você pode obter o gnome-schedule, depois colocar seu comando, por exemplo, vnstat -h, e configurá-lo novamente nos momentos que você está tentando monitorar. Talvez simples demais, mas espero que outra pessoa possa se expandir ainda mais.

Adicional (Editar): 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 agendar um comando para executar durante partes específicas do dia. Portanto, o uso de vntstat -tr -l (comutador de tráfego, monitora o tráfego ao vivo) mostraria o tráfego durante a execução (que você pode agendar no gnome-schedule, mas pode ser necessário Ctrl+ C] manualmente ).

Caso contrário, tenho certeza de que você pode canalizar isso para um arquivo ou usar o programa de saída gráfica para vnstat, se tiver. Programa de saída gráfica é vnstati -i 'filename'irá enviá-lo para o arquivo png. Se você quiser mais comandos, vnstat --longhelp tem mais comandos.

captura de tela

(Exemplo de tela de como colocar as coisas na programação do gnome.)

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

Sem tempo
fonte
Por que ele precisa me perguntar o tempo todo coisas relacionadas ... Quero que ele monitore continuamente o uso da rede e mostre dados separadamente para os horários de pico e fora de pico ... Gostaria de ver os dados sempre que necessário Eu quero. Além disso, há um par de erros de recuo neste programa Python ... (Gostaria de tentar esclarecê-los se você não fazê-lo, entretanto) ...
Aditya
Sim, os travessões ficam bagunçados no fórum, eu tenho que percorrer tudo e adicionar espaços, desculpe por isso. Eu poderia apenas postar o programa py em algum lugar, eu acho. Deixe-me olhar para bancos de dados para isso também.
No Time
@ Aditya, olhei para a sua mensagem de erro do script de totti. Você provavelmente terá que executá-lo como sudo / root, pois os arquivos que estão sendo acessados ​​/ movidos normalmente não têm permissões no nível do usuário. Eu testaria mais o script de totti, mas não posso selecionar o tempo (ou fazer um teste agora) para ver se ele está me dando uma boa saída. Eu precisaria executá-lo por cerca de 8 horas e realmente não quero esperar tanto tempo. Eu não sei o script shell o suficiente para corrigi-lo. se você pudesse alterá-lo para que não seja tão difícil definir se funciona, isso seria legal. (Não tenho rep eu não posso comentar sobre coisas de outras ppl)
No Time
@totti talvez adicione um tempo de entrada variável / usuário?
No Time