Apakah mungkin untuk mengatur jam on-peak dan off-peak di vnstat untuk memonitor bandwidth?

10

Baru-baru ini saya mengunduh vnstatuntuk memantau penggunaan bandwidth Internet saya. Saya memiliki paket data terbatas tetapi ISP saya menyediakan bandwidth yang tidak terukur pada jam-jam tidak sibuk (02:00 hingga 8:00 pagi). Jadi, saya ingin vnstat melaporkan penggunaan data yang mengkategorikan penggunaan on-peak dan off-peak secara terpisah.

Saya telah melalui man vnstattetapi tidak dapat menemukan bantuan dalam hal ini. Apakah mungkin untuk mendapatkan dua statistik yang berbeda untuk penggunaan on-peak dan off-peak vnstat? Jika tidak, alternatif apa yang tersedia bagi saya untuk mencapai hal yang sama?

Aditya
sumber
Saya menulis sebuah program untuk menarik data menarik dari situs web ISP ; mungkin berguna dalam kasus Anda, karena mereka harus mencatat dua tingkat secara individual. Ini menggunakan PhantomJS untuk mengikis data penggunaan. Ini sedikit alfa, tetapi bekerja untuk saya.
halfer
@halfer Terima kasih atas tautannya .. Meskipun saya tidak tahu php / javascript (infact tidak tahu banyak pemrograman), akan melihat apakah saya bisa memanfaatkannya suatu hari nanti ... Mengapa Anda tidak memberikan jawaban dengan menggunakan itu utilitas memberikan contoh untuk satu atau dua ISP ... yang mungkin berguna bagi beberapa orang .. :)
Aditya
Tidak masalah. Tidak ada waktu untuk menulis atm jawaban yang substansial, maka komentar - tetapi mungkin lakukan waktu lain!
halfer

Jawaban:

5

AFAIK tidak ada alat pemantauan bandwidth yang lebih baik dari vnstat. Sayangnya tidak mendukung fitur ini. Tetapi Anda dapat mencapai ini dengan menggunakan beberapa basis data untuk vnstat.

Menyimpan data pada jam sibuk ke vnstat1dan untuk off-peak ke vnstat2. Buat skrip daemon yang akan mengubahnya berdasarkan waktu dalam sehari menggunakan ifkondisi dalam loop tak terbatas; jika tidak antara 02-08 jam gunakan vnstat1nonaktifkan vnstat1, aktifkan vnstat2dan sleep.

Saya menulis skrip bash berikut. Simpan dalam file dan jalankan menggunakan sudo chmod x <filename>. Cobalah beberapa saat. Akhirnya buat skrip otomatis mulai dengan OS. Jalankan sebagai rootpengguna. (Cukup tambahkan path ke skrip /etc/rc.localuntuk dieksekusi saat boot).

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

Ubah i=eth0jalur ke-5 ke antarmuka jaringan yang ingin Anda pantau.

Untuk mengetahui penggunaan berjalan cat /tmp/onpeakdan cat /tmp/offpeakmasing - masing.

Juga merupakan ide bagus untuk mereset data pada database default ( /var/lib/vnstat), karena tidak akan pernah diperbarui jika semua yang ada di skrip berjalan dengan baik.

totti
sumber
2

Semoga ini sedikit membantu.

Jadi saya akan memberi Anda program yang saya tulis, karena saya mengalami masalah dengan cron working. Sayangnya saya tidak tahu scripting shell jadi ini dalam python, tapi itu berhasil untuk saya, dan itu sangat sederhana, tetapi bagus. Maaf saya tidak berkomentar kode saya, tapi saya benar-benar tidak ingin kembali melaluinya. Saya tahu beberapa bagian mungkin bukan yang terbaik, tetapi berhasil.

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

Panduan Cepat

  • Buka Idle, salin> tempel.

  • Simpan sebagai filename.py.

  • Buka Terminal.

  • Jalankan dengan Python 3 (python3 filename.py`).

  • Masukkan jam yang Anda ingin jadwalkan agar vnstat dijalankan.

  • Masukkan menit yang Anda inginkan dari jam itu.

  • Masukkan jumlah jam yang Anda inginkan untuk dipantau.

  • Masukkan jumlah menit yang ingin Anda pantau.

Masukkan perangkat yang Anda pantau (saya tidak pergi dan memeriksa kesalahan, jadi jika Anda memasukkan sesuatu seperti monkeybutt, itu akan mencoba dan menjalankan vnstat -i monkeybutt, setiap 15 detik, cukup Ctrl+ Ckeluar).

Program akan dijalankan setiap 15 detik untuk melihat apakah waktunya cocok, tidak akan memberikan pesan apa pun. Itu dimaksudkan untuk dijalankan di latar belakang. Setelah dimulai, itu akan mengambil bidikan setiap 15 detik dari jaringan, pada perangkat yang Anda pilih. Menggunakan perintah vnstat, plus penghitung yang mengatakan berapa detik yang tersisa dari pemantauan.

Setelah menyelesaikan pemindaian, ia akan menanyakan apakah Anda ingin keluar, dan memberi Anda opsi jika Anda ingin menunjukkan laporan, jika tidak Anda bisa langsung keluar. Semua barang disimpan dalam basis data vnstats.


Bagian lama pos (mungkin bermanfaat bagi sebagian orang)

Anda bisa mendapatkan gnome-schedule, lalu memasukkan perintah Anda misalnya vnstat -h, dan mengaturnya berulang pada saat Anda mencoba memantau. Mungkin terlalu sederhana, tapi semoga orang lain bisa berkembang lebih jauh.

Tambahan (Sunting): Saya belum menggunakan vnstat terlalu banyak, itulah sebabnya saya berharap seseorang dapat memperluas pada bagian itu, tetapi dengan jadwal gnome, Anda dapat menjadwalkan perintah untuk mengeksekusi selama bagian-bagian tertentu hari itu. Jadi menggunakan vntstat -tr -l (traffic switch, monitor traffic langsung), akan menunjukkan traffic saat berjalan (yang bisa Anda jadwalkan di gnome-schedule, tetapi Anda mungkin harus secara manual Ctrl+ C] keluar.)

Kalau tidak, saya yakin Anda bisa menyalurkannya ke file, atau menggunakan program output grafis untuk vnstat jika Anda memilikinya. Program output grafis vnstati -i 'filename'akan menampilkannya ke file png. Jika Anda ingin perintah lebih lanjut vnstat --longhelp memiliki lebih banyak perintah.

tangkapan layar

(Contoh layar tentang bagaimana memasukkan sesuatu ke dalam jadwal gnome.)

Apakah Anda tahu cara mendapatkan 'snapshot' dari bandwidth menggunakan vnstat, atau apakah Anda memerlukan bantuan lebih lanjut tentang perintah-perintah itu? Saya bisa mencoba bekerja dengan program lebih banyak.

Tidak ada waktu
sumber
Mengapa saya perlu menanyakan semua hal terkait waktu ... Saya ingin terus memantau penggunaan jaringan dan menampilkan data secara terpisah untuk jam sibuk dan sibuk ... Saya ingin melihat kedua data kapan pun Saya ingin. Selain itu, ada beberapa bug lekukan dalam program Python ini ... (Saya akan mencoba menjernihkannya jika Anda tidak melakukannya sementara itu) ...
Aditya
Ya indentasi yang kacau di forum, saya harus menjalankan semua hal dan menambahkan spasi, maaf tentang itu. Saya hanya bisa memposting program py di suatu tempat saya kira. Biarkan saya melihat ke dalam database untuk ini juga.
No Time
@Aditya, saya melihat pesan kesalahan Anda dari skrip oleh totti. Anda mungkin harus menjalankannya sebagai sudo / root karena file yang sedang diakses / dipindahkan biasanya tidak memiliki izin level pengguna. Saya akan menguji skrip totti lebih banyak, tetapi saya tidak dapat memilih waktu (atau melakukan tes sekarang) untuk melihat apakah skrip memberi saya hasil yang baik. Saya perlu menjalankannya selama sekitar 8 jam, dan benar-benar tidak ingin menunggu selama itu. Saya tidak tahu cukup shell script untuk memperbaikinya. jika Anda bisa mengubahnya sehingga tidak sesulit waktu yang ditetapkan untuk melihat apakah itu berfungsi, itu akan keren. (Saya tidak punya perwakilan saya tidak bisa mengomentari hal-hal ppl lain)
No Time
@totti mungkin menambahkan waktu input variabel / pengguna?
Tidak Ada Waktu