帯域幅を監視するためにvnstatでオンピークとオフピークの時間を設定することは可能ですか?


10

私は最近vnstat、インターネット帯域幅の使用状況を監視するためにダウンロードしました。データプランが限られていますが、ISPはオフピーク時間(午前2時から午前8時)に計測されていない帯域幅を提供します。したがって、vnstatで、ピーク使用量とオフピーク使用量を別々に分類してデータ使用量を報告してください。

私は経験しましman vnstatたが、この点で助けを見つけることができませんでした。を使用して、ピーク時とオフピーク時の2つの異なる統計情報を取得できvnstatますか?そうでない場合、同じことを達成するためにどのような代替手段を利用できますか?


私は、ISPのWebサイトから興味深いデータ引き出すためのプログラムを書きました。2つのレートを個別にログに記録する必要があるため、この方法が役立つ場合があります。これは、PhantomJSを使用して使用状況データをこすり取ります。それは少しアルファですが、私のために働きます。
2014

@halferリンクをありがとう..私はphp / javascriptを知りませんが(インパクトは多くのプログラミングを知らない)、いつかそれを利用できるかどうかを確認します...なぜそれを使用して答えを出さないか1つまたは2つのISPの例を示すユーティリティ...それは一部の人々にとって便利かもしれません.. :)
Aditya

問題ありません。実質的な回答atm、つまりコメントを書く時間はありませんが、別の機会にうまくいくかもしれません!
2014

回答:


5

AFAIKの帯域幅監視ツールはに勝るものはありませんvnstat。残念ながら、この機能はサポートされていません。しかし、に複数のデータベースを使用することでこれを実現できますvnstat

ピークの時間のためのデータを保存vnstat1し、オフピークのためvnstat2if無限ループの条件を使用して、時刻に基づいてそれらを切り替えるデーモンスクリプトを作成します。02-08時間の間にない場合は、vnstat1他の無効化vnstat1、有効化、vnstat2およびを使用してくださいsleep

次のbashスクリプトを作成しました。ファイルに保存し、を使用して実行可能にしsudo chmod x <filename>ます。しばらくテストしてください。最後に、スクリプトをOSで自動起動します。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=eth05行目で、監視するネットワークインターフェイスに変更します。

使用状況cat /tmp/onpeakcat /tmp/offpeakそれぞれ知るため。

また、デフォルトデータベース(/var/lib/vnstat)のデータをリセットすることをお勧めします。スクリプト内のすべてがうまくいくと更新されないからです。



2

うまくいけば、これは少し助けになります。

ですから、私が書いたプログラムをお見せしましょう。cronの動作に問題があったからです。残念ながらシェルスクリプトのことは知らないので、これはpythonで行われますが、私にとってはうまくいきました。かなりシンプルですが、すばらしいです。申し訳ありませんが、コードにはコメントしませんでしたが、実際にコードを確認したくありませんでした。一部のパーツが最適でない可能性があることはわかっていますが、問題なく機能します。

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を開き、コピーして貼り付けます。

  • として保存しfilename.pyます。

  • ターミナルを開きます。

  • Python 3(python3 filename.py`)で実行します。

  • vnstatの実行をスケジュールしたい時間に入れます。

  • その時間に必要な分を入れてください。

  • 監視する時間を入力します。

  • 監視したい分数を入力します。

監視しているデバイスを入力します(私はエラーチェックを行わなかったため、monkeybuttのようなものを入力すると、vnstat -i monkeybutt15秒ごとに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に入れる方法のサンプル画面。)

vnstatを使用して帯域幅の「スナップショット」を取得する方法を知っていますか、またはそれらのコマンドについてさらにヘルプが必要ですか?このプログラムをもっと使ってみることができます。


なぜ常に関連する質問をする必要があるのですか...ネットワークの使用状況を継続的に監視し、オンピーク時間とオフピーク時間に分けてデータを表示したいのですが...両方のデータをいつでも確認したいが欲しいです。さらに、このPythonプログラムにはいくつかのインデントバグがあります...(当面の間、それを行わない場合は解決しようと思います)...
Aditya

ええ、インデントがフォーラムでめちゃくちゃになるので、すみません、すべてのものを実行してスペースを追加する必要があります。私はどこかにpyプログラムを投稿することができます。これについてもデータベースを調べてみましょう。
ノータイム

@Aditya、私はスクリプトからのエラーメッセージをtottiで調べました。通常、アクセスまたは移動されるファイルにはユーザーレベルの権限がないため、sudo / rootとして実行する必要があります。私はtottiのスクリプトをさらにテストしますが、時間を選択して(または今すぐテストを実行して)良い出力が得られるかどうかを確認することはできません。私はそれを約8時間実行する必要があり、本当にそんなに長く待ちたくありません。私はそれを修正するのに十分なシェルスクリプトを知りません。変更できるので、機能するかどうかを確認するのにそれほど苦労しなければ、それはすばらしいことです。(私は他の皆さんのものにコメントすることはできません何の担当者を持っていません)
時間がない

@tottiは変数/ユーザー入力時間を追加する可能性がありますか?
ノータイム、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.