AFAIK nenhuma ferramenta de monitoramento de largura de banda é melhor que vnstat
. Infelizmente não suporta este recurso. Mas você pode conseguir isso usando vários bancos de dados para vnstat
.
Salve os dados das horas de pico em vnstat1
e fora de pico em vnstat2
. Crie um script daemon que os alterne com base na hora do dia usando uma condição if
em um loop infinito; se não entre 02-08 horas use vnstat1
else desabilitar vnstat1
, habilitar vnstat2
e sleep
.
Eu escrevi o seguinte script bash. Salve-o em um arquivo e torne-o executável usando sudo chmod x <filename>
. Teste isso por algum tempo. Finalmente, faça o script iniciar automaticamente com o sistema operacional. Execute-o como o usuário root
. (Basta adicionar o caminho para o script em /etc/rc.local
para que ele seja executado no momento da inicialização).
#!/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'
Altere i=eth0
na quinta linha para a interface de rede que você deseja monitorar.
Para saber o uso, execute cat /tmp/onpeak
e cat /tmp/offpeak
, respectivamente.
Além disso, é uma boa ideia redefinir os dados no banco de dados padrão ( /var/lib/vnstat
), pois ele nunca será atualizado se tudo no script for bem.