เป็นไปได้หรือไม่ที่จะกำหนดชั่วโมงเร่งด่วนและชั่วโมงเร่งด่วนใน vnstat สำหรับการตรวจสอบแบนด์วิดธ์?


10

ฉันเพิ่งดาวน์โหลดvnstatเพื่อตรวจสอบการใช้แบนด์วิดท์อินเทอร์เน็ตของฉัน ฉันมีแผนข้อมูลที่ จำกัด แต่ ISP ของฉันมอบแบนด์วิดท์ที่ไม่มีการตรวจสอบในช่วงเวลาที่มีผู้ใช้งานไม่มาก (2:00 AM ถึง 8:00 AM) ดังนั้นฉันต้องการ vnstat เพื่อรายงานการใช้ข้อมูลที่จัดหมวดหมู่การใช้งานสูงสุดและการใช้งานต่ำ

ฉันผ่านไปแล้วman vnstatแต่ไม่พบความช่วยเหลือในเรื่องนี้ เป็นไปได้ไหมที่จะได้รับสถิติที่แตกต่างกันสองแบบสำหรับช่วงเวลาที่มีการใช้งานมากและvnstatน้อย ถ้าไม่ฉันมีทางเลือกอะไรบ้างในการบรรลุเป้าหมายเดียวกัน


ผมเขียนโปรแกรมเพื่อดึงข้อมูลที่น่าสนใจจากเว็บไซต์ของ ISP ; อาจเป็นประโยชน์ในกรณีของคุณเนื่องจากควรบันทึกสองอัตราแยกกัน สิ่งนี้ใช้ PhantomJS เพื่อขูดข้อมูลการใช้งาน มันค่อนข้างอัลฟา แต่ใช้ได้สำหรับฉัน
halfer

@ halfer ขอบคุณสำหรับการเชื่อมโยง .. แม้ว่าฉันจะไม่ทราบ php / javascript (infact ไม่ทราบว่าการเขียนโปรแกรมมาก) จะดูว่าฉันสามารถใช้ประโยชน์จากมันสักวัน ... ทำไมคุณไม่ให้คำตอบโดยใช้สิ่งนั้น ยูทิลิตี้ให้ตัวอย่างสำหรับหนึ่งหรือสองผู้ให้บริการอินเทอร์เน็ตและ ... ที่อาจมามีประโยชน์สำหรับบางคน .. :)
Aditya

ไม่มีปัญหา. ไม่มีเวลาที่จะเขียนคำตอบอย่างมีนัยสำคัญ ATM ดังนั้นความคิดเห็น - แต่อาจทำอีกครั้ง!
halfer

คำตอบ:


5

AFAIK vnstatไม่มีแบนด์วิดธ์เครื่องมือการตรวจสอบจะดีกว่า น่าเสียดายที่มันไม่รองรับคุณสมบัตินี้ vnstatแต่คุณสามารถบรรลุนี้โดยใช้ฐานข้อมูลหลาย

บันทึกข้อมูลสำหรับในชั่วโมงเร่งด่วนที่จะvnstat1และ off-peak vnstat2ไป สร้าง daemon script ที่จะเปลี่ยนตามเวลาของวันโดยใช้ifเงื่อนไขในการวนซ้ำไม่สิ้นสุด ถ้าไม่ได้อยู่ระหว่าง 02-08 ชั่วโมงใช้vnstat1อื่นปิดการใช้งานvnstat1ให้เปิดใช้งานและ vnstat2sleep

ฉันเขียนสคริปต์ทุบตีต่อไปนี้ บันทึกไว้ในไฟล์และทำให้มันใช้งานsudo chmod x <filename>ได้ ทดสอบบางครั้ง จนทำให้สคริปต์เริ่มต้นอัตโนมัติด้วยระบบปฏิบัติการ เรียกใช้ในฐานะrootผู้ใช้ (เพียงเพิ่มเส้นทางไปยังสคริปต์/etc/rc.localเพื่อให้สามารถดำเนินการได้ในเวลาบูต)

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

เปลี่ยนi=eth0บรรทัดที่ 5 เป็นอินเตอร์เฟสเครือข่ายที่คุณต้องการตรวจสอบ

หากต้องการทราบว่าการใช้งานcat /tmp/onpeakและcat /tmp/offpeakตามลำดับ

นอกจากนี้คุณควรรีเซ็ตข้อมูลในฐานข้อมูลเริ่มต้น ( /var/lib/vnstat) เนื่องจากจะไม่มีการอัปเดตหากทุกอย่างในสคริปต์ทำงานได้ดี



2

หวังว่านี่จะช่วยได้บ้าง

ดังนั้นฉันจะให้โปรแกรมที่ฉันเขียนเพราะคุณมีปัญหากับการทำงาน cron ฉันไม่ทราบว่าการเขียนสคริปต์เชลล์น่าเสียดายดังนั้นนี่เป็นงูหลาม แต่มันใช้งานได้สำหรับฉันและมันค่อนข้างง่าย แต่ก็ดี ขออภัยฉันไม่ได้แสดงความคิดเห็นรหัสของฉัน แต่ฉันไม่ต้องการกลับไปที่มัน ฉันรู้ว่าบางส่วนอาจไม่ได้ดีที่สุด แต่ใช้งานได้

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

คู่มือฉบับย่อ

  • เปิด Idle, copy> paste

  • filename.pyบันทึกเป็น

  • เปิด Terminal

  • เรียกใช้ด้วย Python 3 (python3 filename.py`)

  • ใส่ในชั่วโมงที่คุณต้องการกำหนดให้ vnstat ทำงาน

  • ใส่ในนาทีที่คุณต้องการของชั่วโมงนั้น

  • ใส่จำนวนชั่วโมงที่คุณต้องการตรวจสอบ

  • ใส่จำนวนนาทีที่คุณต้องการตรวจสอบ

ป้อนอุปกรณ์ที่คุณกำลังตรวจสอบ (ฉันไม่ได้ผ่านและตรวจสอบข้อผิดพลาดดังนั้นถ้าคุณป้อนบางอย่างเช่น monkeybutt มันจะพยายามและทำงานvnstat -i monkeybuttทุก ๆ 15 วินาทีเพิ่งCtrl+ Cออก)

โปรแกรมจะทำงานทุก ๆ 15 วินาทีเพื่อดูว่าเวลาตรงกันหรือไม่โปรแกรมจะไม่ส่งข้อความใด ๆ มันหมายถึงการทำงานในพื้นหลัง เมื่อเริ่มต้นมันจะทำการถ่ายภาพทุก ๆ 15 วินาทีของเครือข่ายบนอุปกรณ์ที่คุณเลือก การใช้คำสั่ง vnstat รวมถึงตัวนับที่บอกว่าคุณเหลือเวลาในการมอนิเตอร์กี่วินาที

หลังจากเสร็จสิ้นการสแกนแล้วระบบจะถามว่าคุณต้องการออกจากระบบหรือไม่และให้ตัวเลือกแก่คุณหากคุณต้องการแสดงรายงานไม่เช่นนั้นคุณก็สามารถออกได้ ทุกสิ่งถูกเก็บไว้ในฐานข้อมูล vnstats ต่อไป


ส่วนเก่าของโพสต์ (อาจเป็นประโยชน์กับบางคน)

คุณสามารถรับ gnome-schedule จากนั้นใส่คำสั่งของคุณตัวอย่างเช่น vnstat -h และตั้งค่าให้เกิดขึ้นอีกครั้งในระหว่างที่คุณพยายามตรวจสอบ อาจจะง่ายเกินไป แต่หวังว่าคนอื่นจะสามารถขยายเพิ่มเติมได้

เพิ่มเติม (แก้ไข): ฉันไม่ได้ใช้ vnstat มากซึ่งเป็นสาเหตุที่ฉันหวังว่าจะมีใครบางคนสามารถขยายส่วนนั้นได้ แต่ด้วย gnome-schedule คุณสามารถกำหนดเวลาคำสั่งให้ดำเนินการระหว่างส่วนที่เฉพาะเจาะจงของวัน ดังนั้นการใช้ vntstat -tr -l (สวิทช์การจราจร, ตรวจสอบทราฟฟิกแบบสด) จะแสดงทราฟฟิกในขณะที่ทำงาน (ซึ่งคุณสามารถกำหนดตารางเวลาใน gnome-schedule ได้ แต่คุณอาจต้องCtrl+ ด้วยตนเองC)

มิฉะนั้นฉันแน่ใจว่าคุณสามารถไพพ์นี้เป็นไฟล์หรือใช้โปรแกรมแสดงผลกราฟิกสำหรับ vnstat ถ้าคุณมีสิ่งนั้น โปรแกรมแสดงผลกราฟิกvnstati -i 'filename'จะถูกส่งออกไปยังไฟล์ png หากคุณต้องการคำสั่งเพิ่มเติมvnstat --longhelp มีคำสั่งเพิ่มเติม

ภาพหน้าจอ

(หน้าจอตัวอย่างของการใส่สิ่งต่าง ๆ ลงใน gnome-schedule)

คุณรู้วิธีรับ 'snapshot' ของแบนด์วิดท์โดยใช้ vnstat แล้วหรือคุณต้องการความช่วยเหลือเพิ่มเติมเกี่ยวกับคำสั่งเหล่านั้นหรือไม่? ฉันสามารถลองทำงานกับโปรแกรมมากขึ้น


ทำไมต้องถามฉันเกี่ยวกับสิ่งต่าง ๆ ตลอดเวลา ... ฉันต้องการให้มันตรวจสอบการใช้งานเครือข่ายอย่างต่อเนื่องและแสดงข้อมูลแยกกันสำหรับชั่วโมงเร่งด่วนสูงสุดและนอกเวลาเร่งด่วน ... ฉันต้องการดูทั้งข้อมูลเมื่อใดก็ตาม ฉันต้องการ. นอกจากนี้ยังมีข้อผิดพลาดการเยื้องสองสามรายการในโปรแกรม Python นี้ ... (ฉันจะพยายามล้างมันถ้าคุณไม่ทำในตอนนี้) ...
Aditya

ใช่เยื้องเข้าไปยุ่งกับฟอรั่มฉันต้องวิ่งผ่านทุกสิ่งและเพิ่มช่องว่างขอโทษด้วย ฉันสามารถโพสต์โปรแกรม py ที่ไหนสักแห่งที่ฉันเดา ให้ฉันดูในฐานข้อมูลสำหรับสิ่งนี้เช่นกัน
ไม่มีเวลา

@Aditya ฉันดูข้อความผิดพลาดจากสคริปต์โดย totti คุณอาจจะต้องเรียกใช้มันเป็น sudo / root เนื่องจากไฟล์ที่มีการเข้าถึง / ย้ายไม่ปกติมีสิทธิ์ระดับผู้ใช้ ฉันจะทดสอบสคริปต์ Totti ของเพิ่มเติม แต่ฉันไม่สามารถเลือกเวลา (หรือทำแบบทดสอบตอนนี้) เพื่อดูว่ามันให้ผลลัพธ์ที่ดีหรือไม่ ฉันจะต้องใช้มันประมาณ 8 ชั่วโมงและไม่อยากรอนานขนาดนั้น ฉันไม่รู้จัก shell script เพียงพอที่จะแก้ไขได้ หากคุณสามารถเปลี่ยนได้ดังนั้นจึงไม่ยากที่จะตรวจสอบว่ามันใช้งานได้ดีหรือไม่ (ฉันไม่มีตัวแทนฉันไม่สามารถแสดงความคิดเห็นกับเนื้อหาอื่น ๆ ของ ppl)
ไม่มีเวลา

@totti อาจเพิ่มตัวแปร / เวลาป้อนข้อมูลของผู้ใช้หรือไม่
ไม่มีเวลา
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.