J'ai récemment téléchargé vnstat
pour surveiller mon utilisation de la bande passante Internet. J'ai un forfait de données limité, mais mon fournisseur de services Internet fournit une bande passante illimitée pendant les heures creuses (de 2h00 à 8h00). Je voudrais donc que vnstat rapporte l’utilisation des données en catégorisant l’utilisation en période de pointe et l’utilisation en période creuse séparément.
J'ai parcouru man vnstat
mais je n'ai trouvé aucune aide à cet égard. Serait-il possible d'obtenir deux statistiques différentes pour les heures de pointe et les heures creuses en utilisant vnstat
? Si non, quelles alternatives sont à ma disposition pour atteindre le même objectif?
Autant que je sache, aucun outil de surveillance de la bande passante n’est meilleur que vnstat
. Malheureusement, il ne supporte pas cette fonctionnalité. Mais vous pouvez y parvenir en utilisant plusieurs bases de données pour vnstat
.
Enregistrez les données sur vnstat1
pour les heures de pointe et sur vnstat2
pour les heures creuses. Créez un script démon qui les commutera en fonction de l'heure du jour à l'aide d'une condition if
dans une boucle infinie; sinon, entre 02 et 08 heures, utilisez vnstat1
sinon désactivez vnstat1
, activez vnstat2
et sleep
.
J'ai écrit le script bash suivant. Enregistrez-le dans un fichier et rendez-le exécutable à l'aide de Sudo chmod x <filename>
. Testez-le pendant un certain temps. Enfin, faites le script démarrer automatiquement avec OS. Exécutez-le en tant qu'utilisateur root
. (Ajoutez simplement le chemin du script dans /etc/rc.local
pour qu'il soit exécuté au moment du démarrage).
#!/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`
Remplacez i=eth0
sur la 5ème ligne par l’interface réseau que vous souhaitez surveiller.
Pour connaître l'utilisation, exécutez cat /tmp/onpeak
et cat /tmp/offpeak
respectivement.
Il est également judicieux de réinitialiser les données de la base de données par défaut (/var/lib/vnstat
), car elles ne seront jamais mises à jour si tout se passe bien dans le script.
Espérons que cela aide un peu.
Donc, je vais vous donner un programme que j'ai écrit, parce que j'avais des problèmes avec le travail de cron. Malheureusement, je ne connais pas les scripts Shell, donc c’est en python, mais cela a fonctionné pour moi, et c’est assez simple, mais agréable. Désolé de ne pas avoir commenté mon code, mais je ne voulais vraiment pas revenir en arrière. Je sais que certaines parties ne sont peut-être pas les meilleures, mais cela fonctionne.
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()
Ouvrez Idle, copiez> collez.
Enregistrer sous filename.py
.
Terminal ouvert.
Exécutez-le avec Python 3 (python3 nomfichier.py`).
Mettez l'heure à laquelle vous souhaitez programmer l'exécution de vnstat.
Mettez dans la minute que vous voulez de cette heure.
Indiquez le nombre d'heures que vous souhaitez surveiller.
Mettez le nombre de minutes que vous souhaitez surveiller.
Entrez le périphérique que vous surveillez (je ne suis pas passé par le contrôle d'erreur, donc si vous entrez quelque chose comme monkeybutt, il va essayer d'exécuter vnstat -i monkeybutt
, toutes les 15 secondes, juste Ctrl+C en dehors).
Le programme se déroulera toutes les 15 secondes pour voir si l'heure correspond, il ne donnera aucun message. C'est censé être exécuté en arrière-plan. Une fois que cela a commencé, cela prend une photo toutes les 15 secondes du réseau, sur le périphérique que vous avez choisi. A l'aide de la commande vnstat, plus un compteur indiquant le nombre de secondes qu'il vous reste à surveiller.
Une fois les analyses terminées, le système vous demandera si vous souhaitez quitter et vous indiquera une option si vous souhaitez afficher un rapport. Sinon, vous pouvez simplement quitter. De toute façon, tous les éléments sont stockés dans la base de données vnstats.
Vous pouvez obtenir gnome-schedule, puis entrer votre commande, par exemple vnstat -h, et la définir de manière à ce qu'elle se répète pendant les périodes que vous essayez de surveiller. Peut-être trop simple, mais j'espère que quelqu'un d'autre pourra se développer davantage.
Additional (Edit): Je n'ai pas beaucoup utilisé vnstat, c'est pourquoi j'espérais que quelqu'un pourrait développer cette partie, mais avec gnome-schedule, vous pouvez planifier l'exécution d'une commande pendant des parties spécifiques de la journée. Donc, utiliser vntstat -tr -l (commutateur de trafic, surveiller le trafic réel) afficherait le trafic en cours d'exécution (que vous pouvez planifier dans gnome-schedule, mais vous devrez peut-être manuellement Ctrl+C] en dehors.)
Sinon, je suis sûr que vous pouvez transférer cela dans un fichier ou utiliser le programme de sortie graphique pour vnstat si vous en avez. Le programme de sortie graphique est vnstati -i 'filename'
le sortira dans un fichier png. Si vous voulez d'autres commandes, vnstat --longhel
p a plus de commandes.
(Exemple d'écran sur la manière de mettre des choses dans gnome-schedule.)
Savez-vous comment obtenir déjà un "instantané" de la bande passante en utilisant vnstat, ou avez-vous besoin d'une aide supplémentaire pour ces commandes? Je peux essayer de travailler avec le programme plus.