Я недавно загрузил vnstat
для мониторинга использования моей пропускной способности Интернет. У меня ограниченный тариф на передачу данных, но мой интернет-провайдер обеспечивает неограниченную пропускную способность в непиковые часы (с 2:00 до 8:00). Итак, я хотел бы, чтобы vnstat сообщал об использовании данных, классифицируя пиковое использование и непиковое использование отдельно.
Я прошел man vnstat
, но не смог найти никакой помощи в этом отношении. Можно ли получить две разные статистические данные за часы пиковой и непиковой нагрузки, используя vnstat
? Если нет, то какие альтернативы мне доступны для достижения того же самого?
AFAIK никакой контрольный инструмент пропускной способности лучше, чем vnstat
. К сожалению, это не поддерживает эту функцию. Но можно достигнуть этого при помощи нескольких баз данных для vnstat
.
Сохраняют данные для на часах пик к vnstat1
и для непикового к vnstat2
. Сделайте сценарий демона, который переключит их на основе времени дня с помощью if
условие в бесконечном цикле; если не между использованием 02-08 часов vnstat1
еще отключают vnstat1
, включают vnstat2
и sleep
.
я записал следующий сценарий удара. Сохраните его в файле и сделайте его исполняемым файлом с помощью [1 110]. Тестируйте его в течение некоторого времени. Наконец сделайте автоматический запуск сценария с ОС. Выполните его как root
пользователь. (Просто добавьте путь к сценарию в [1 112] для него, чтобы быть выполненными во время начальной загрузки).
#!/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
), поскольку это никогда не будет обновлять, если все в сценарии будет подходить.
Надо надеяться, это помогает немного.
, Таким образом, я собираюсь дать Вам программу, которую я записал, потому что у меня были проблемы с работой крона. Я не знаю оболочку, пишущую сценарий, к сожалению, таким образом, это находится в 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 monkeybutt
, каждые 15 секунд, просто Ctrl + C ).
программа будет пробегать каждые 15 секунд, чтобы видеть, соответствует ли время, это не даст сообщений. Это предназначено, чтобы быть выполненным в фоновом режиме. Как только это запускается, это сделает снимок каждые 15 секунд сети на устройстве, которое Вы выбрали. Используя команду vnstat, плюс счетчик, говорящий, сколько секунд Вы уехали контроля.
После завершения сканирований это спросит, хотите ли Вы выйти, и дать Вам опцию, если Вы хотите показать отчет, иначе можно просто выйти. Весь материал хранится в vnstats базе данных так или иначе.
<час>Вы могли получить расписание гнома, затем вставить Вашу команду, например, vnstat-h и установить его повторяющийся в течение времен, которые Вы пытаетесь контролировать. Возможно, слишком простой, но надо надеяться кто-то еще мог расшириться далее.
Дополнительный (Редактирование): Я не использовал vnstat очень, который является, почему я надеялся, что кто-то мог подробно остановиться на той части, но с расписанием гнома, можно запланировать команду для выполнения во время определенных частей дня. Так с помощью vntstat - TR-l (переключение трафика, монитор живой трафик), показал бы трафик при выполнении (который можно запланировать в расписании гнома, но Вы можете иметь к вручную Ctrl + C ].)
Иначе я уверен, что Вы могли передать это по каналу в файл или использовать программу вывода графических данных для vnstat, если у Вас есть это. Программа вывода графических данных vnstati -i 'filename'
, произведет его в png файл. Если Вы хотите дальнейшие команды vnstat --longhel
, p имеет больше команд.
(Демонстрационный экран того, как поместить вещи в расписание гнома.)
Вы знаете, как уже получить 'снимок' пропускной способности с помощью vnstat, или Вы нуждаетесь в дальнейшей помощи на тех командах? Я могу попытаться работать с программой больше.