Мой ноутбук имеет два сетевых интерфейса 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 ГБ) объединит оба интерфейса в течение месяца.
Этот сценарий удара сложит 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"}
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
.