Có thể đặt giờ cao điểm và giờ thấp điểm trong vnstat để theo dõi băng thông không?


10

Gần đây tôi đã tải xuống vnstatđể theo dõi việc sử dụng băng thông Internet của tôi. Tôi có gói dữ liệu hạn chế nhưng ISP của tôi cung cấp băng thông không được đáp ứng trong giờ thấp điểm (2:00 AM đến 8:00 AM). Vì vậy, tôi muốn vnstat báo cáo việc sử dụng dữ liệu phân loại sử dụng trên cao điểm và sử dụng ngoài giờ cao điểm một cách riêng biệt.

Tôi đã trải qua man vnstatnhưng không thể tìm thấy bất kỳ trợ giúp về vấn đề này. Có thể có được hai số liệu thống kê khác nhau cho giờ cao điểm và giờ thấp điểm vnstatkhông? Nếu không, những lựa chọn thay thế có sẵn cho tôi để đạt được như vậy?


Tôi đã viết một chương trình để lấy dữ liệu thú vị ra khỏi trang web của ISP ; nó có thể hữu ích trong trường hợp của bạn, vì họ nên đăng nhập hai tỷ lệ riêng lẻ. Điều này sử dụng PhantomJS để cạo dữ liệu sử dụng. Đó là một chút alpha, nhưng làm việc cho tôi.
Halfer

@halfer Cảm ơn liên kết .. Mặc dù tôi không biết php / javascript (không biết lập trình nhiều), nhưng hãy xem liệu tôi có thể sử dụng nó vào một ngày nào đó không ... Tại sao bạn không đưa ra câu trả lời bằng cách sử dụng tiện ích đưa ra một ví dụ cho một hoặc hai ISP ... có thể hữu ích cho một số người .. :)
Aditya

Không có probs. Không có thời gian để viết một câu trả lời đáng kể, vì vậy bình luận - nhưng cũng có thể làm một lần khác!
halfer

Câu trả lời:


5

AFAIK không có công cụ giám sát băng thông nào tốt hơn vnstat. Thật không may, nó không hỗ trợ tính năng này. Nhưng bạn có thể đạt được điều này bằng cách sử dụng nhiều cơ sở dữ liệu cho vnstat.

Lưu dữ liệu vào giờ cao điểm đến vnstat1và ngoài giờ cao điểm vnstat2. Tạo một tập lệnh daemon sẽ chuyển đổi chúng dựa trên thời gian trong ngày bằng cách sử dụng một ifđiều kiện trong một vòng lặp vô hạn; nếu không trong khoảng từ 02-08 giờ, hãy sử dụng , vnstat1tắt và vnstat1bật . vnstat2sleep

Tôi đã viết kịch bản bash sau đây. Lưu nó trong một tập tin và làm cho nó thực thi bằng cách sử dụng sudo chmod x <filename>. Kiểm tra nó một thời gian. Cuối cùng làm cho kịch bản tự động bắt đầu với HĐH. Chạy nó như rootngười dùng. (Chỉ cần thêm đường dẫn đến tập lệnh /etc/rc.localđể nó được thực thi khi khởi động).

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

Thay đổi i=eth0trên dòng thứ 5 sang giao diện mạng mà bạn muốn theo dõi.

Để biết cách sử dụng chạy cat /tmp/onpeakcat /tmp/offpeaktương ứng.

Ngoài ra, nên đặt lại dữ liệu trên cơ sở dữ liệu mặc định ( /var/lib/vnstat) vì nó sẽ không bao giờ cập nhật nếu mọi thứ trong tập lệnh diễn ra tốt.



2

Hy vọng điều này sẽ giúp một chút.

Vì vậy, tôi sẽ cung cấp cho bạn một chương trình tôi đã viết, bởi vì tôi gặp vấn đề với cron làm việc. Tôi không biết shell script rất tiếc vì đây là python, nhưng nó hoạt động với tôi, và nó khá đơn giản, nhưng hay. Xin lỗi tôi đã không nhận xét mã của tôi, nhưng tôi thực sự không muốn quay lại nó. Tôi biết một số phần có thể không phải là tốt nhất, nhưng nó hoạt động.

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

Hướng dẫn nhanh

  • Mở Idle, sao chép> dán.

  • Lưu như filename.py.

  • Mở Terminal.

  • Chạy nó với Python 3 (python3 filename.py`).

  • Đặt trong giờ bạn muốn lên lịch để vnstat chạy.

  • Đặt trong phút bạn muốn của giờ đó.

  • Đặt số giờ bạn muốn nó theo dõi.

  • Đặt số phút bạn muốn nó theo dõi.

Nhập thiết bị bạn đang theo dõi (Tôi đã không kiểm tra và kiểm tra lỗi, vì vậy nếu bạn nhập một cái gì đó như khỉbutt, nó sẽ thử và chạy vnstat -i monkeybutt, cứ sau 15 giây, chỉ cần Ctrl+ Cra).

Chương trình sẽ chạy trong mỗi 15 giây để xem thời gian có khớp hay không, nó sẽ không đưa ra bất kỳ tin nhắn nào. Nó có nghĩa là để chạy trong nền. Khi nó bắt đầu, nó sẽ chụp cứ sau 15 giây trên mạng, trên thiết bị bạn chọn. Sử dụng lệnh vnstat, cộng với bộ đếm cho biết bạn còn bao nhiêu giây để theo dõi.

Sau khi hoàn thành quá trình quét, nó sẽ hỏi bạn có muốn thoát hay không và cung cấp cho bạn một tùy chọn nếu bạn muốn hiển thị báo cáo, nếu không bạn chỉ có thể thoát. Tất cả các công cụ được lưu trữ trong cơ sở dữ liệu vnstats dù sao.


Phần cũ của bài đăng (có thể hữu ích cho một số người)

Bạn có thể nhận được lịch trình gnome, sau đó đưa vào lệnh của bạn ví dụ vnstat -h và đặt nó lặp lại trong thời gian bạn đang cố gắng theo dõi. Có thể quá đơn giản, nhưng hy vọng người khác có thể mở rộng hơn nữa.

Bổ sung (Chỉnh sửa): Tôi chưa sử dụng vnstat nhiều, đó là lý do tại sao tôi hy vọng ai đó có thể mở rộng phần đó, nhưng với lịch trình gnome, bạn có thể lên lịch để thực hiện lệnh trong các phần cụ thể trong ngày. Vì vậy, sử dụng vntstat -tr -l (công tắc giao thông, theo dõi lưu lượng truy cập trực tiếp), sẽ hiển thị lưu lượng truy cập trong khi chạy (mà bạn có thể lên lịch trong lịch trình gnome, nhưng bạn có thể phải tự tắt Ctrl+ C].)

Mặt khác, tôi chắc chắn rằng bạn có thể chuyển dữ liệu này thành một tệp hoặc sử dụng chương trình đầu ra đồ họa cho vnstat nếu bạn có. Chương trình đầu ra đồ họa vnstati -i 'filename'sẽ xuất nó thành tập tin png. Nếu bạn muốn thêm lệnh vnstat --longhelp có nhiều lệnh hơn.

ảnh chụp màn hình

(Màn hình mẫu về cách đưa mọi thứ vào lịch trình gnome.)

Bạn có biết làm thế nào để có được một 'ảnh chụp nhanh' băng thông bằng cách sử dụng vnstat không, hoặc bạn có cần trợ giúp thêm về các lệnh đó không? Tôi có thể cố gắng làm việc với chương trình nhiều hơn.


Tại sao nó phải hỏi tôi tất cả những thứ liên quan đến thời gian ... Tôi muốn nó liên tục theo dõi việc sử dụng mạng và hiển thị dữ liệu riêng cho giờ cao điểm và giờ thấp điểm ... Tôi muốn xem cả dữ liệu bất cứ khi nào Tôi muốn. Hơn nữa, có một vài lỗi thụt trong chương trình Python này ... (Tôi sẽ cố gắng xóa chúng nếu bạn không làm điều đó trong thời gian này) ...
Aditya

Vâng, các thụt lề bị rối tung trên diễn đàn, tôi phải chạy qua mọi thứ và thêm khoảng trắng, xin lỗi về điều đó. Tôi chỉ có thể đăng chương trình py ở đâu đó tôi đoán. Hãy để tôi xem xét cơ sở dữ liệu cho điều này là tốt.
Không có thời gian

@Aditya, tôi đã xem thông báo lỗi của bạn từ kịch bản của totti. Bạn có thể sẽ phải chạy nó dưới dạng sudo / root vì các tệp đang được truy cập / di chuyển thường không có quyền cấp độ người dùng. Tôi sẽ kiểm tra tập lệnh của totti nhiều hơn, nhưng tôi không thể chọn thời gian (hoặc thực hiện kiểm tra ngay bây giờ) để xem liệu nó có cho tôi đầu ra tốt không. Tôi sẽ cần chạy nó trong khoảng 8 giờ và thực sự không muốn đợi lâu như vậy. Tôi không biết shell script đủ để sửa nó. nếu bạn có thể thay đổi nó để không khó để thiết lập nếu nó hoạt động, điều đó sẽ rất tuyệt. (Tôi không có đại diện. Tôi không thể nhận xét về nội dung của ppl khác)
Không có thời gian

@totti có thể thêm thời gian đầu vào biến / người dùng?
Không có thời gian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.