是否可以在 vnstat 中设置高峰和非高峰时间来监控带宽?

Adi*_*tya 10 command-line bandwidth vnstat

我最近下载vnstat了监控我的互联网带宽使用情况。我的数据计划有限,但我的 ISP 在非高峰时段(凌晨 2:00 至上午 8:00)提供不限流量的带宽。因此,我希望 vnstat 报告数据使用情况,分别对高峰使用和非高峰使用进行分类。

我已经经历过,man vnstat但在这方面找不到任何帮助。是否可以使用 获得高峰和非高峰时段的两种不同统计数据vnstat?如果没有,我可以使用哪些替代方法来实现相同的目标?

tot*_*tti 5

AFAIK 没有带宽监控工具比vnstat. 不幸的是,它不支持此功能。但是您可以通过使用多个数据库来实现这一点vnstat

将高峰时段的数据保存到vnstat1和非高峰时段的数据vnstat2。制作一个守护程序脚本,该脚本将使用if无限循环中的条件根据一天中的时间切换它们;如果不是在 02-08 小时之间,请使用vnstat1else disable vnstat1、enablevnstat2sleep

我编写了以下 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`
Run Code Online (Sandbox Code Playgroud)

i=eth0第 5 行更改为要监视的网络接口。

要知道用法 runcat /tmp/onpeakcat /tmp/offpeak分别。

Also it's a good idea to reset the data on the default database (/var/lib/vnstat), as it will never update if everything in the script goes well.