Можно ли установить часы пиковой и непиковой нагрузки в vnstat для мониторинга пропускной способности?
Я недавно скачал vnstat
контролировать использование моей пропускной способности интернета. У меня ограниченный тариф на передачу данных, но мой интернет-провайдер обеспечивает неограниченную пропускную способность в непиковые часы (с 2:00 до 8:00). Итак, я хотел бы, чтобы vnstat сообщал об использовании данных по категориям при пиковом и непиковом использовании по отдельности.
Я прошел man vnstat
но не мог найти никакой помощи в этом отношении. Можно ли получить две разные статистические данные за часы пиковой и непиковой нагрузки, используя vnstat
? Если нет, то какие альтернативы мне доступны для достижения того же?
2 ответа
AFAIK нет инструмента контроля пропускной способности лучше, чем vnstat
, К сожалению, он не поддерживает эту функцию. Но вы можете достичь этого, используя несколько баз данных для vnstat
,
Сохраните данные в часы пик в vnstat1
и для непиковой vnstat2
, Создайте скрипт-демон, который будет переключать их в зависимости от времени суток, используя if
условие в бесконечном цикле; если не между 02-08 часами используйте vnstat1
еще отключить vnstat1
, включить vnstat2
а также sleep
,
Я написал следующий скрипт bash. Сохраните его в файл и сделайте его исполняемым с помощью 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
), так как он никогда не будет обновляться, если все в сценарии идет хорошо.
Надеюсь, это немного поможет.
Итак, я собираюсь дать вам программу, которую я написал, потому что у меня были проблемы с работой 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()
Краткое руководство
Откройте в режиме ожидания, скопируйте> вставить.
Сохранить как
filename.py
,Откройте Терминал.
Запустите его с 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 --longhel
р имеет больше команд.
(Пример экрана того, как поместить вещи в гном-расписание.)
Знаете ли вы, как получить "снимок" полосы пропускания с помощью vnstat, или вам нужна дополнительная помощь по этим командам? Я могу попытаться работать с программой больше.