10 votes

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

J'ai récemment téléchargé vnstat pour surveiller ma consommation de bande passante Internet. J'ai un plan de données limité mais mon ISP fournit une bande passante non mesurée pendant les heures creuses (de 2h00 à 8h00). J'aimerais donc que vnstat rapporte l'utilisation des données en classant séparément l'utilisation en heures pleines et l'utilisation en heures creuses.

Je suis passé par man vnstat mais n'a pas trouvé d'aide à ce sujet. Serait-il possible d'obtenir deux statistiques différentes pour les heures de pointe et les heures creuses en utilisant les données suivantes vnstat ? Si ce n'est pas le cas, quelles sont les alternatives qui s'offrent à moi pour y parvenir ?

5voto

jpbochi Points 2380

AFAIK aucun outil de surveillance de la bande passante n'est meilleur que vnstat . Malheureusement, il ne prend pas en charge cette fonctionnalité. Cependant, vous pouvez y parvenir en utilisant plusieurs bases de données pour les éléments suivants vnstat .

Sauvegarder les données pour les heures de pointe afin de vnstat1 et pour les heures creuses à vnstat2 . Faites un daemon script qui les changera en fonction de l'heure de la journée en utilisant un if dans une boucle infinie ; si ce n'est pas entre 02-08 heures, utiliser vnstat1 Sinon, désactivez vnstat1 , permettre vnstat2 y sleep .

J'ai écrit le bash script suivant. Sauvegardez-le dans un fichier et rendez-le exécutable en utilisant sudo chmod x <filename> . Testez-le pendant un certain temps. Enfin, faites en sorte que le script démarre automatiquement avec l'OS. Exécutez-le comme le root utilisateur. (Il suffit d'ajouter le chemin vers le script en /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`

Changement i=eth0 sur la 5e ligne vers l'interface réseau que vous voulez surveiller.

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

C'est aussi une bonne idée de réinitialiser les données de la base de données par défaut ( /var/lib/vnstat ), car il ne sera jamais mis à jour si tout se passe bien dans le script.

2voto

No Time Points 1098

J'espère que cela vous aidera un peu.

Je vais donc vous donner un programme que j'ai écrit, car j'avais des problèmes avec le fonctionnement de cron. Je ne connais pas le Shell script malheureusement donc c'est en Python, mais ça a marché pour moi, et c'est assez simple, mais sympa. Désolé de ne pas avoir commenté mon code, mais je n'avais vraiment pas envie d'y revenir. Je sais que certaines parties ne sont peut-être pas les meilleures, mais ça marche.

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, copier>coller.

  • Enregistrer sous filename.py .

  • Terminal ouvert.

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

  • Entrez l'heure à laquelle vous voulez programmer l'exécution de vnstat.

  • Mettez la minute que vous voulez de cette heure.

  • Indiquez le nombre d'heures pendant lesquelles vous voulez qu'il surveille.

  • Indiquez le nombre de minutes pendant lesquelles vous souhaitez que la surveillance soit assurée.

Entrez le dispositif que vous surveillez (je n'ai pas vérifié les erreurs, donc si vous entrez quelque chose comme monkeybutt, il essaiera d'exécuter vnstat -i monkeybutt toutes les 15 secondes, juste Ctrl + C out).

Le programme s'exécute toutes les 15 secondes pour voir si l'heure correspond, il ne donne aucun message. Il est destiné à être exécuté en arrière-plan. Une fois lancé, il prendra une photo du réseau toutes les 15 secondes, sur le périphérique que vous avez choisi. En utilisant la commande vnstat, plus un compteur indiquant combien de secondes il vous reste à surveiller.

Une fois les analyses terminées, le logiciel vous demandera si vous voulez quitter, et vous donnera la possibilité d'afficher un rapport, sinon vous pouvez simplement quitter. Tous les éléments sont stockés dans la base de données vnstats de toute façon.


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

Vous pourriez obtenir gnome-schedule, puis mettre votre commande, par exemple vnstat -h, et la faire se répéter pendant les périodes que vous essayez de surveiller. Peut-être trop simple, mais j'espère que quelqu'un d'autre pourra 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 le gnome-schedule, vous pouvez programmer une commande pour qu'elle s'exécute à des moments spécifiques de la journée. Ainsi, en utilisant vntstat -tr -l (commutateur de trafic, surveiller le trafic en direct), vous verrez le trafic en cours d'exécution (ce que vous pouvez programmer dans gnome-schedule, mais vous devrez peut-être le faire manuellement). Ctrl + C ).

Sinon, je suis sûr que vous pouvez le mettre dans un fichier, ou utiliser le programme de sortie graphique de vnstat si vous l'avez. Le programme de sortie graphique est vnstati -i 'filename' l'éditera dans un fichier png. Si vous voulez d'autres commandes vnstat --longhel p a plus de commandes.

screenshot

(Exemple d'écran montrant comment mettre des choses dans gnome-schedule).

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X