Ist es möglich, in vnstat Spitzen- und Nebenzeiten für die Überwachung der Bandbreite festzulegen?

10

Ich habe kürzlich heruntergeladen vnstat, um die Nutzung meiner Internetbandbreite zu überwachen. Ich habe einen begrenzten Datentarif, aber mein ISP bietet außerhalb der Spitzenzeiten (2:00 bis 8:00 Uhr) eine nicht gemessene Bandbreite. Daher möchte ich, dass vnstat die Datennutzung getrennt kategorisiert, wobei die Nutzung zu Spitzenzeiten und die Nutzung außerhalb der Spitzenzeiten getrennt kategorisiert werden.

Ich habe durchgemacht man vnstat, konnte aber diesbezüglich keine Hilfe finden. Wäre es möglich, zwei verschiedene Statistiken für Spitzen- und Nebenzeiten zu erhalten vnstat? Wenn nicht, welche Alternativen stehen mir zur Verfügung, um dasselbe zu erreichen?

Aditya
quelle
Ich habe ein Programm geschrieben, um interessante Daten von der Website des Internetdienstanbieters abzurufen. Dies kann in Ihrem Fall hilfreich sein, da die beiden Tarife einzeln protokolliert werden sollten. Dies verwendet PhantomJS, um die Nutzungsdaten zu kratzen. Es ist ein bisschen Alpha, funktioniert aber für mich.
Halfer
@halfer Danke für den Link. Obwohl ich PHP / Javascript nicht kenne (Infact weiß nicht viel über Programmierung), würde ich sehen, ob ich es eines Tages nutzen könnte ... Warum gibst du damit keine Antwort? Dienstprogramm mit einem Beispiel für ein oder zwei ISPs ... das für einige Leute nützlich sein könnte .. :)
Aditya
Kein Problem. Keine Zeit, eine substanzielle Antwort zu schreiben atm, daher der Kommentar - aber vielleicht ein anderes Mal!
Halfer

Antworten:

5

AFAIK kein Bandbreitenüberwachungstool ist besser als vnstat. Leider wird diese Funktion nicht unterstützt. Sie können dies jedoch erreichen, indem Sie mehrere Datenbanken für verwenden vnstat.

Speichern Sie die Daten für Spitzenzeiten bis vnstat1und für Nebenzeiten bis vnstat2. Erstellen Sie ein Daemon-Skript, das sie basierend auf der Tageszeit unter Verwendung einer ifBedingung in einer Endlosschleife wechselt. Wenn nicht zwischen 02-08 Stunden, vnstat1sonst deaktivieren vnstat1, aktivieren vnstat2und sleep.

Ich habe das folgende Bash-Skript geschrieben. Speichern Sie es in einer Datei und machen Sie es mit ausführbar sudo chmod x <filename>. Testen Sie es für einige Zeit. Lassen Sie das Skript schließlich automatisch mit dem Betriebssystem starten. Führen Sie es als rootBenutzer aus. (Fügen Sie einfach den Pfad zum Skript hinzu, /etc/rc.localdamit es beim Booten ausgeführt wird.)

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

Wechseln Sie i=eth0in der 5. Zeile zu der Netzwerkschnittstelle, die Sie überwachen möchten.

Um zu wissen , die Nutzung laufen cat /tmp/onpeakund cat /tmp/offpeakjeweils.

Es ist auch eine gute Idee, die Daten in der Standarddatenbank ( /var/lib/vnstat) zurückzusetzen, da sie niemals aktualisiert werden, wenn alles im Skript gut läuft.

totti
quelle
2

Hoffentlich hilft das ein bisschen.

Also werde ich Ihnen ein Programm geben, das ich geschrieben habe, weil ich Probleme mit der Arbeit mit Cron hatte. Ich kenne Shell-Scripting leider nicht, daher ist dies in Python, aber es hat bei mir funktioniert und es ist ziemlich einfach, aber nett. Entschuldigung, ich habe meinen Code nicht kommentiert, aber ich wollte ihn wirklich nicht noch einmal durchgehen. Ich weiß, dass einige Teile vielleicht nicht die besten sind, aber es funktioniert.

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

Kurzanleitung

  • Leerlauf öffnen, kopieren> einfügen.

  • Speichern unter filename.py.

  • Terminal öffnen.

  • Führen Sie es mit Python 3 (python3 filename.py`) aus.

  • Geben Sie die Stunde ein, für die vnstat ausgeführt werden soll.

  • Geben Sie die gewünschte Minute für diese Stunde ein.

  • Geben Sie die Anzahl der Stunden an, die überwacht werden sollen.

  • Geben Sie die Anzahl der Minuten an, auf die überwacht werden soll.

Geben Sie das Gerät ein, das Sie überwachen (ich habe keine Fehlerprüfung durchgeführt. Wenn Sie also etwas wie monkeybutt eingeben, wird es vnstat -i monkeybuttalle 15 Sekunden ausgeführt, nur Ctrl+ Cout).

Das Programm wird alle 15 Sekunden durchlaufen, um festzustellen, ob die Zeit übereinstimmt. Es werden keine Nachrichten ausgegeben. Es soll im Hintergrund laufen. Sobald es gestartet ist, wird alle 15 Sekunden eine Aufnahme des Netzwerks auf dem von Ihnen ausgewählten Gerät gemacht. Verwenden Sie den Befehl vnstat sowie einen Zähler, der angibt, wie viele Sekunden noch für die Überwachung übrig sind.

Nach Abschluss der Scans werden Sie gefragt, ob Sie das Programm beenden möchten, und Sie erhalten eine Option, wenn Sie einen Bericht anzeigen möchten. Andernfalls können Sie das Programm einfach beenden. Das ganze Zeug wird sowieso in der vnstats-Datenbank gespeichert.


Alter Teil des Beitrags (kann für einige Leute hilfreich sein)

Sie können den Gnome-Zeitplan abrufen, dann Ihren Befehl eingeben, z. B. vnstat -h, und festlegen, dass er zu Zeiten, die Sie überwachen möchten, erneut auftritt. Vielleicht zu einfach, aber hoffentlich könnte jemand anderes weiter expandieren.

Zusätzlich (Bearbeiten): Ich habe vnstat nicht sehr oft verwendet, weshalb ich gehofft hatte, dass jemand diesen Teil erweitern könnte, aber mit dem Gnome-Zeitplan können Sie einen Befehl planen, der während bestimmter Teile des Tages ausgeführt wird. Wenn Sie also vntstat -tr -l (Verkehrsschalter, Live-Verkehr überwachen) verwenden, wird der Verkehr während der Ausführung angezeigt (was Sie im Gnome-Zeitplan planen können, aber möglicherweise manuell Ctrl+ C] ausgeben müssen.)

Andernfalls können Sie dies sicher in eine Datei weiterleiten oder das grafische Ausgabeprogramm für vnstat verwenden, wenn Sie dies haben. Das grafische Ausgabeprogramm gibt vnstati -i 'filename'es in eine PNG-Datei aus. Wenn Sie weitere Befehle wünschen, hat vnstat --longhelp mehr Befehle.

Bildschirmfoto

(Beispielbildschirm, wie man Dinge in den Gnom-Zeitplan einfügt.)

Wissen Sie, wie Sie mit vnstat bereits einen "Schnappschuss" der Bandbreite erstellen können, oder benötigen Sie weitere Hilfe zu diesen Befehlen? Ich kann versuchen, mehr mit dem Programm zu arbeiten.

Keine Zeit
quelle
Warum muss ich ständig nach zeitbezogenen Informationen gefragt werden? Ich möchte, dass die Netzwerknutzung kontinuierlich überwacht und die Daten für Spitzen- und Nebenzeiten getrennt angezeigt werden. Ich möchte beide Daten jederzeit anzeigen Ich möchte. Darüber hinaus gibt es ein paar Einrückungsfehler in diesem Python-Programm ... (Ich würde versuchen, sie zu beseitigen, wenn Sie es in der Zwischenzeit nicht tun) ...
Aditya
Ja, die Einrückungen werden im Forum durcheinander gebracht. Ich muss alles durchgehen und Leerzeichen hinzufügen. Tut mir leid. Ich könnte das py-Programm einfach irgendwo posten, denke ich. Lassen Sie mich auch dafür in Datenbanken schauen.
Keine Zeit
@Aditya, ich habe mir deine Fehlermeldung aus dem Skript von totti angesehen. Sie müssen es wahrscheinlich als sudo / root ausführen, da die Dateien, auf die zugegriffen / die verschoben werden, normalerweise keine Berechtigungen auf Benutzerebene haben. Ich würde das Skript von totti mehr testen, aber ich kann keine Zeit auswählen (oder jetzt einen Test durchführen), um zu sehen, ob es mir eine gute Ausgabe liefert. Ich müsste es ungefähr 8 Stunden lang laufen lassen und möchte wirklich nicht so lange warten. Ich kenne das Shell-Skript nicht genug, um es zu beheben. Wenn Sie es ändern könnten, damit es nicht so schwer ist zu sehen, ob es funktioniert, wäre das cool. (Ich habe keinen Repräsentanten, den ich nicht kommentieren kann)
Keine Zeit
@totti vielleicht eine Variable / Benutzereingabezeit hinzufügen?
Keine Zeit