vnstat объединяет несколько интерфейсов общей пропускной способности

Мой ноутбук имеет два сетевых интерфейса enp59s0 и wlp60s0. Исторически я всегда использовал карту Ethernet (enp59s0), поэтому использование vnstat для получения сетевого потребления на сегодня, вчера, текущую неделю и текущий месяц никогда не было проблемой для меня.

Недавно я переехал и теперь использую WiFi (wlp60s0), и мне пришлось изменить мой код conky:

${color}${goto 5}Today ${goto 100}Yesterday ${goto 225}Week ${goto 325}Month ${color green}
# vnstatd updates database every five minutes
${execi 300 vnstat -i wlp60s0 | grep "today" | awk '{print $8" "substr ($9, 1, 1)}'} ${goto 110}${execi 300 vnstat -i wlp60s0 | grep "yesterday" | awk '{print $8" "substr ($9, 1, 1)}'} ${goto 220}${execi 300 vnstat -i wlp60s0 -w | grep "current week" | awk '{print $9" "substr ($10, 1, 1)}'} ${goto 315}${execi 300 vnstat -i wlp60s0 -m | grep "`date +"%b '%y"`" | awk '{print $9" "substr ($10, 1, 1)}'}

Мне неловко менять хитрый код, поэтому мне бы хотелось, чтобы оба wlp60s0 ] и enp59s0 в сочетании со скриптом bash под названием vnall.

Это не только избавит меня от изменения кода Conky при каждом входе в систему, но и общий ежемесячный биллинг в сети (разрешено 500 ГБ) объединит оба интерфейса в течение месяца.

1
задан 2 September 2019 в 21:33

2 ответа

Этот сценарий удара сложит vnstat общие количества для нескольких интерфейсов:

#!/bin/bash

# NAME: vnall
# DESC: Add up multiple interfaces of vnstat into totals for today,
#       yesterday, current week and current month.
# PARM: "today", "yesterday", "week" (current), "month" (current)
# DATE: September 2, 2019. Modified September 4, 2019.

# To discover interfaces `lshw -c network` then place names below
# aInterfaces=( "enp59s0" "wlp60s0" )
# Use automatic discovery if you are unsure of names or don't want to look up
Interfaces=( $(lshw -c network 2>/dev/null | grep name: | cut -d':' -f2) )

Tally () {
    Ktot=0     # Totals in KiB, MiB and GiB
    Mtot=0
    Gtot=0
    # Tally all interfaces
    local i Interface Line Raw ThisNum
    for (( i=0; i<${#aInterfaces[@]}; i++ )) ; do

        Interface="${aInterfaces[i]}"
        if [[ "$vnstatParm" == "" ]] ; then
            Line=$(vnstat -i "$Interface" | grep "$GrepString")
        else
            Line=$(vnstat -i "$Interface" "$vnstatParm" | grep "$GrepString")
        fi

        [[ $Line == "" ]] && continue   # No data collected yet
        if [[ $vnstatParm == "" ]] ; then
            Raw=$(echo "$Line" | awk '{print $8 substr ($9, 1, 1)}')
        else
            Raw=$(echo "$Line" | awk '{print $9 substr ($10, 1, 1)}')
        fi

        ThisNum="${Raw::-1}"    # Number without suffix
        case ${Raw: -1} in      # Decide on last character K, M or G
            K)
                Ktot=$(echo "$Ktot + $ThisNum " | bc) ;;
            M)
                Mtot=$(echo "$Mtot + $ThisNum " | bc) ;;
            G)
                Gtot=$(echo "$Gtot + $ThisNum " | bc) ;;
            *)
                echo "Unknown Unit: ${Raw: -1}" ;;
        esac
    done

    [[ $Gtot != "0" ]] && { echo "$Gtot G" ; return ; }
    [[ $Mtot != "0" ]] && { echo "$Mtot M" ; return ; }
    [[ $Ktot != "0" ]] && { echo "$Ktot K" ; return ; }
    echo "N/A"
} # Tally

Init () {
    GrepString="$1"     # Create defaults for "today" and "yesterday"
    vnstatParm=""
    if [[ $1 == week ]] ; then
        GrepString="current $GrepString"
        vnstatParm="-w"
    fi
    if [[ $1 == month ]] ; then
        GrepString=$(date +"%b '%y")
        vnstatParm="-m"
    fi
} # Init

Init "$@"
Tally

Автоматический по сравнению с Ручными именами интерфейса

Примечания этот раздел кода:

# To discover interfaces `lshw -c network` then place names below
# aInterfaces=( "enp59s0" "wlp60s0" )
# Use automatic discovery if you are unsure of names or don't want to look up
Interfaces=( $(lshw -c network 2>/dev/null | grep name: | cut -d':' -f2) )

Четвертая строка автоматически обнаруживает имена интерфейса (в моем случае enp59s0 и wlp60s0) и создает массив интерфейсов (aInterfaces). Если Вы предпочитаете вручную указывать, что имена в Вашем сценарии затем помещают комментарий (#) в начале строки и некомментария вторая строка путем удаления # префикс строки.

Носатый код значительно уменьшается

Поскольку новое vnall сценарий автоматически создает параметры по мере необходимости, носатый код намного меньше, чем прежде:

${color}${goto 5}Today ${goto 100}Yesterday ${goto 225}Week ${goto 325}Month ${color green}
# vnstatd updates database every five minutes
${execi 300 vnall "today"} ${goto 110}${execi 300 vnall "yesterday"} ${goto 220}${execi 300 vnall "week"} ${goto 315}${execi 300 vnall "month"}

Носатое изображение

vnall.png

4
ответ дан 3 December 2019 в 06:36

vnstat управляйте данными интерфейса слияния поддержек внутренне с помощью + синтаксис, как объяснено страницей справочника:

-i, --iface interface
       Select one specific interface and apply actions to only it. For queries, it is possible to merge the information of two or
       more interfaces using the interface1+interface2+...  syntax.

В Вашем случае достаточно заменить -i wlp60s0 с -i wlp60s0+enp59s0.

1
ответ дан 3 December 2019 в 06:36

Другие вопросы по тегам:

Похожие вопросы: