web-dev-qa-db-fra.com

Est-il possible de définir des heures de pointe et des heures creuses dans vnstat pour surveiller la bande passante?

J'ai récemment téléchargé vnstat pour surveiller mon utilisation de la bande passante Internet. J'ai un forfait de données limité, mais mon fournisseur de services Internet fournit une bande passante illimitée pendant les heures creuses (de 2h00 à 8h00). Je voudrais donc que vnstat rapporte l’utilisation des données en catégorisant l’utilisation en période de pointe et l’utilisation en période creuse séparément.

J'ai parcouru man vnstat mais je n'ai trouvé aucune aide à cet égard. Serait-il possible d'obtenir deux statistiques différentes pour les heures de pointe et les heures creuses en utilisant vnstat? Si non, quelles alternatives sont à ma disposition pour atteindre le même objectif?

10
Aditya

Autant que je sache, aucun outil de surveillance de la bande passante n’est meilleur que vnstat. Malheureusement, il ne supporte pas cette fonctionnalité. Mais vous pouvez y parvenir en utilisant plusieurs bases de données pour vnstat.

Enregistrez les données sur vnstat1 pour les heures de pointe et sur vnstat2 pour les heures creuses. Créez un script démon qui les commutera en fonction de l'heure du jour à l'aide d'une condition if dans une boucle infinie; sinon, entre 02 et 08 heures, utilisez vnstat1 sinon désactivez vnstat1, activez vnstat2 et sleep.

J'ai écrit le script bash suivant. Enregistrez-le dans un fichier et rendez-le exécutable à l'aide de Sudo chmod x <filename>. Testez-le pendant un certain temps. Enfin, faites le script démarrer automatiquement avec OS. Exécutez-le en tant qu'utilisateur root. (Ajoutez simplement le chemin du script dans /etc/rc.local pour qu'il soit exécuté au moment du démarrage).

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

Remplacez i=eth0 sur la 5ème ligne par l’interface réseau que vous souhaitez surveiller.

Pour connaître l'utilisation, exécutez cat /tmp/onpeak et cat /tmp/offpeak respectivement.

Il est également judicieux de réinitialiser les données de la base de données par défaut (/var/lib/vnstat), car elles ne seront jamais mises à jour si tout se passe bien dans le script.

5
totti

Espérons que cela aide un peu.

Donc, je vais vous donner un programme que j'ai écrit, parce que j'avais des problèmes avec le travail de cron. Malheureusement, je ne connais pas les scripts Shell, donc c’est en python, mais cela a fonctionné pour moi, et c’est assez simple, mais agréable. Désolé de ne pas avoir commenté mon code, mais je ne voulais vraiment pas revenir en arrière. Je sais que certaines parties ne sont peut-être pas les meilleures, mais cela fonctionne.

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

Guide rapide

  • Ouvrez Idle, copiez> collez.

  • Enregistrer sous filename.py.

  • Terminal ouvert.

  • Exécutez-le avec Python 3 (python3 nomfichier.py`).

  • Mettez l'heure à laquelle vous souhaitez programmer l'exécution de vnstat.

  • Mettez dans la minute que vous voulez de cette heure.

  • Indiquez le nombre d'heures que vous souhaitez surveiller.

  • Mettez le nombre de minutes que vous souhaitez surveiller.

Entrez le périphérique que vous surveillez (je ne suis pas passé par le contrôle d'erreur, donc si vous entrez quelque chose comme monkeybutt, il va essayer d'exécuter vnstat -i monkeybutt, toutes les 15 secondes, juste Ctrl+C en dehors).

Le programme se déroulera toutes les 15 secondes pour voir si l'heure correspond, il ne donnera aucun message. C'est censé être exécuté en arrière-plan. Une fois que cela a commencé, cela prend une photo toutes les 15 secondes du réseau, sur le périphérique que vous avez choisi. A l'aide de la commande vnstat, plus un compteur indiquant le nombre de secondes qu'il vous reste à surveiller.

Une fois les analyses terminées, le système vous demandera si vous souhaitez quitter et vous indiquera une option si vous souhaitez afficher un rapport. Sinon, vous pouvez simplement quitter. De toute façon, tous les éléments sont stockés dans la base de données vnstats.


Ancienne partie du message (peut être utile pour certaines personnes)

Vous pouvez obtenir gnome-schedule, puis entrer votre commande, par exemple vnstat -h, et la définir de manière à ce qu'elle se répète pendant les périodes que vous essayez de surveiller. Peut-être trop simple, mais j'espère que quelqu'un d'autre pourra se développer davantage.

Additional (Edit): Je n'ai pas beaucoup utilisé vnstat, c'est pourquoi j'espérais que quelqu'un pourrait développer cette partie, mais avec gnome-schedule, vous pouvez planifier l'exécution d'une commande pendant des parties spécifiques de la journée. Donc, utiliser vntstat -tr -l (commutateur de trafic, surveiller le trafic réel) afficherait le trafic en cours d'exécution (que vous pouvez planifier dans gnome-schedule, mais vous devrez peut-être manuellement Ctrl+C] en dehors.)

Sinon, je suis sûr que vous pouvez transférer cela dans un fichier ou utiliser le programme de sortie graphique pour vnstat si vous en avez. Le programme de sortie graphique est vnstati -i 'filename' le sortira dans un fichier png. Si vous voulez d'autres commandes, vnstat --longhelp a plus de commandes.

screenshot

(Exemple d'écran sur la manière de mettre des choses dans gnome-schedule.)

Savez-vous comment obtenir déjà un "instantané" de la bande passante en utilisant vnstat, ou avez-vous besoin d'une aide supplémentaire pour ces commandes? Je peux essayer de travailler avec le programme plus.

2
No Time