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

10

J'ai récemment téléchargé vnstatpour surveiller ma consommation de bande passante Internet. J'ai un plan de données limité mais mon FAI fournit une bande passante non mesurée pendant les heures creuses (de 2h00 à 8h00). Donc, je voudrais que vnstat rapporte séparément l'utilisation des données classant l'utilisation en pointe et l'utilisation hors pointe.

J'ai traversé man vnstatmais 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? Sinon, quelles alternatives s'offrent à moi pour y parvenir?

Aditya
la source
J'ai écrit un programme pour extraire des données intéressantes du site Web du FAI ; cela pourrait être utile dans votre cas, car ils devraient enregistrer les deux taux individuellement. Cela utilise PhantomJS pour gratter les données d'utilisation. C'est un peu alpha, mais ça marche pour moi.
halfer le
@halfer Merci pour le lien .. Bien que je ne connaisse pas le php / javascript (en fait je ne connais pas beaucoup la programmation), je verrais si je pourrais l'utiliser un jour ... Pourquoi ne donneriez-vous pas une réponse en utilisant cela utilitaire donnant un exemple pour un ou deux FAI ... qui pourrait être utile pour certaines personnes .. :)
Aditya
Pas de problème. Pas le temps d'écrire une réponse substantielle, d'où le commentaire - mais pourrait bien faire une autre fois!
halfer le

Réponses:

5

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

Enregistrez les données pour les heures de pointe vers vnstat1et pour les heures creuses jusqu'à vnstat2. Créez un script démon qui les commutera en fonction de l'heure de la journée en utilisant une ifcondition dans une boucle infinie; sinon entre 02 et 08 heures, utilisez vnstat1else disable vnstat1, enable vnstat2et 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 démarrer automatiquement le script avec OS. Exécutez-le en tant rootqu'utilisateur. (Ajoutez simplement le chemin du script /etc/rc.localpour qu'il soit exécuté au 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`

Modifiez i=eth0sur la 5ème ligne l'interface réseau que vous souhaitez surveiller.

Pour connaître le cycle d'utilisation cat /tmp/onpeaket cat /tmp/offpeakrespectivement.

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

totti
la source
2

Espérons que cela aide un peu.

Je vais donc vous donner un programme que j'ai écrit, parce que j'avais des problèmes avec le travail cron. Je ne connais malheureusement 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é, je n'ai pas commenté mon code, mais je ne voulais vraiment pas y revenir. 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 Inactif, copiez> collez.

  • Enregistrer sous filename.py.

  • Ouvrez le terminal.

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

  • Entrez l'heure à laquelle vous souhaitez planifier l'exécution de vnstat.

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

  • Mettez le nombre d'heures que vous souhaitez qu'il surveille.

  • Mettez le nombre de minutes que vous voulez qu'il surveille.

Entrez l'appareil que vous surveillez (je n'ai pas effectué de vérification d'erreur, donc si vous entrez quelque chose comme monkeybutt, il essaiera de s'exécuter vnstat -i monkeybutt, toutes les 15 secondes, juste Ctrl+ Cout).

Le programme se déroulera toutes les 15 secondes pour voir si l'heure correspond, il ne donnera aucun message. Il est censé être exécuté en arrière-plan. Une fois démarré, il prendra une photo toutes les 15 secondes du réseau, sur l'appareil que vous avez choisi. Utilisation de la commande vnstat, plus un compteur indiquant combien de secondes il vous reste de surveillance.

Après avoir terminé les analyses, il vous demandera si vous souhaitez quitter et vous donnera une option si vous souhaitez afficher un rapport, sinon vous pouvez simplement quitter. De toute façon, tout est stocké dans la base de données vnstats.


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

Vous pouvez obtenir gnome-schedule, puis entrez votre commande, par exemple vnstat -h, et définissez-la de manière répétée pendant les périodes que vous essayez de surveiller. Peut-être trop simple, mais j'espère que quelqu'un d'autre pourrait se développer davantage.

Supplémentaire (Modifier): 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 une commande à exécuter pendant des parties spécifiques de la journée. Donc, utiliser vntstat -tr -l (commutateur de trafic, surveiller le trafic en direct), afficherait le trafic pendant l'exécution (que vous pouvez planifier dans gnome-schedule, mais vous devrez peut-être manuellement Ctrl+ C].)

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

capture d'écran

(Exemple d'écran sur la façon de mettre les choses en programme gnome.)

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

Pas le temps
la source
Pourquoi a-t-il besoin de me poser toutes les questions liées au temps ... Je veux qu'il surveille en permanence l'utilisation du réseau et affiche les données séparément pour les heures de pointe et les heures creuses ... Je voudrais voir les deux données à chaque fois Je voudrais. De plus, il y a quelques bogues d'indentation dans ce programme Python ... (j'essaierais de les éliminer si vous ne le faites pas entre-temps) ...
Aditya
Oui, les retraits sont gâchés sur le forum, je dois parcourir tout et ajouter des espaces, désolé. Je pourrais simplement poster le programme py quelque part je suppose. Permettez-moi également d'examiner les bases de données.
Pas de temps
@Aditya, j'ai regardé votre message d'erreur du script par totti. Vous devrez probablement l'exécuter en tant que sudo / root car les fichiers qui sont accédés / déplacés n'ont normalement pas d'autorisations de niveau utilisateur. Je testerais davantage le script de totti, mais je ne peux pas sélectionner l'heure (ou faire un test maintenant) pour voir si cela me donne une bonne sortie. Je devrais l'exécuter pendant environ 8 heures et je ne veux vraiment pas attendre aussi longtemps. Je ne connais pas assez le script shell pour le corriger. si vous pouviez le changer pour qu'il ne soit pas aussi difficile de voir si cela fonctionne, ce serait cool. (Je n'ai pas de représentant, je ne peux pas commenter les trucs des autres)
No Time
@totti peut-être ajouter un temps d'entrée variable / utilisateur?
Pas de temps du