대역폭을 모니터링하기 위해 vnstat에서 피크가 아닌 시간과 피크가 아닌 시간을 설정할 수 있습니까?


10

vnstat인터넷 대역폭 사용량을 모니터링하기 위해 최근에 다운로드 했습니다. 데이터 요금이 제한되어 있지만 ISP는 사용량이 적은 시간 (오전 2 시부 터 오전 8 시까 지)에 계량되지 않은 대역폭을 제공합니다. 따라서 vnstat가 피크 사용률과 피크 사용률을 별도로 분류하여 데이터 사용량을보고하고 싶습니다.

나는 겪었 man vnstat지만이 점에서 어떤 도움도 찾을 수 없었습니다. 를 사용하여 피크가 아닌 시간과 피크가 아닌 시간에 대해 서로 다른 두 가지 통계를 얻을 수 vnstat있습니까? 그렇지 않다면 어떤 대안을 사용하여 동일한 결과를 얻을 수 있습니까?


ISP의 웹 사이트에서 흥미로운 데이터가져 오는 프로그램을 작성했습니다 . 두 요금을 개별적으로 기록해야하므로 유용 할 수 있습니다. PhantomJS를 사용하여 사용량 데이터를 긁습니다. 약간의 알파이지만 나를 위해 작동합니다.
14:14 at half

@halfer 링크 주셔서 감사합니다. php / javascript (실제로 많은 프로그래밍을 알지 못함)는 모르지만 언젠가는 그것을 사용할 수 있는지 볼 것입니다 ... 하나 또는 두 개의 ISP에 대한 예제를 제공하는 유틸리티 ... 일부 사람들에게는 유용 할 수 있습니다 .. :)
Aditya

문제 없다. 실질적인 답변을 작성할 시간이 없으므로 의견을 말하지만 다른 시간을 할 수도 있습니다!
14:14 at 절반

답변:


5

AFAIK보다 대역폭 모니터링 도구가 더 좋습니다 vnstat. 불행히도이 기능은 지원하지 않습니다. 그러나에 대해 여러 데이터베이스를 사용하여이를 달성 할 수 있습니다 vnstat.

사용량이 많지 않은 시간 vnstat1및 사용량이 적은 시간에 대한 데이터를 저장하십시오 vnstat2. if무한 루프 의 조건을 사용하여 하루 중 시간을 기반으로 전환하는 데몬 스크립트를 만듭니다 . 02-08 시간이 아니라면 vnstat1disable 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=eth0다섯 번째 줄에서 모니터링하려는 네트워크 인터페이스로 변경하십시오 .

사용법 cat /tmp/onpeakcat /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()              

빠른 설명

  • 유휴를 열고 복사> 붙여 넣기

  • 다른 이름으로 저장하십시오 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에 더 많은 명령이 있습니다.

스크린 샷

(그놈 일정에 물건을 넣는 방법의 샘플 화면)

이미 vnstat를 사용하여 대역폭의 '스냅 샷'을 얻는 방법을 알고 있거나 해당 명령에 대한 추가 도움이 필요하십니까? 프로그램으로 더 많은 작업을 시도 할 수 있습니다.


왜 항상 관련 항목을 묻어 야합니까? 네트워크 사용량을 지속적으로 모니터링하고 사용량이 적은 시간과 사용량이 적은 시간에 대해 개별적으로 데이터를 표시하기를 원합니다. 내가 원하는. 또한,이 파이썬 프로그램에는 몇 개의 들여 쓰기 버그가 있습니다 ... (그동안 그렇게하지 않으면 버그를 정리하려고합니다) ...
Aditya

예, 들여 쓰기가 포럼에서 엉망이됩니다. 나는 모든 것을 통과하고 공백을 추가해야합니다. 죄송합니다. 나는 어딘가에 py 프로그램을 게시 할 수 있었다. 이것에 대해서도 데이터베이스를 살펴 보겠습니다.
시간 없음

@Aditya, 나는 totti의 스크립트에서 오류 메시지를 보았습니다. 액세스 / 이동중인 파일에는 일반적으로 사용자 수준 권한이 없으므로 sudo / root로 실행해야합니다. 나는 totti의 스크립트를 더 테스트 할 것이지만, 나에게 좋은 결과를 주는지 확인하기 위해 시간을 선택할 수 없거나 지금 테스트 할 수 없다. 나는 약 8 시간 동안 실행해야하며 실제로 그렇게 오래 기다리기를 원하지 않습니다. 나는 그것을 고치기에 충분한 쉘 스크립트를 모른다. 만약 당신이 그것을 바꿀 수 있다면 그것이 작동하는지보기 힘든 시간이 걸리지 않으면 멋질 것입니다. (나는 다른 ppl의 내용에 대해 언급 할 수있는 담당자가 없습니다)
시간 없음

@totti는 변수 / 사용자 입력 시간을 추가 할 수 있습니까?
시간 없음
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.