Это возможно, если и только если терминал отправляет различные escape-последовательности за Ctrl+Left по сравнению с Левым. Дело обстоит не так по умолчанию на консоли Linux (по крайней мере, на моей машине). Можно сделать его так путем изменения контурной карты. Точный файл для изменения может зависеть от распределения; на Debian lenny файл для изменения /etc/console/boottime.kmap.gz
. Вам нужны строки как
control keycode 105 = F100
string F100 = "\033O5D"
control keycode 106 = F101
string F101 = "\033O5C"
Вы могли бы также выбрать те же escape-последовательности в качестве своих X эмуляторов терминала. Для обнаружения, какова управляющая последовательность введите Ctrl+V Ctrl+Left в оболочке; это вставляет (на моей машине) ^[O5D
где ^[
символ ESC. В файле контурной карты, \033
представляет символ ESC.
Конфигурирование приложения в терминале для декодирования escape-последовательности является отдельной проблемой.
Кажется, что счетчики являются целыми числами на 32 бита, таким образом, они "повторяются" в ~4GB.
Проблема определенно заключается в 32-битном целочисленном ответе, представленном выше. У меня была такая же проблема. Это связано с операционной системой, установленной на процессоре, который может ее запустить.
Если вы используете 32-битную ОС на 64-битном процессоре, вы также будете ограничены 4 Гб.
2^32 = 4294967296
4294967296/1024/1024/1024/1024 = 4
Я был очень расстроен тем, что мой (32-битный) файловый сервер не мог отслеживать многие терабайты, которые он передавал, поэтому я создал небольшой скрипт для отслеживания использования данных для него (как eth0, так и wlan0):
getstats. sh
находится в /usr/local/bin/system/
#! /bin/bash
# CHECK FOR FILE IN /USR/LOCAL/BIN/SYSTEM
# COPY ACTUAL FILES TO MAINTAIN DATA CONSISTENCY DURING CALCULATIONS
cp /sys/class/net/eth0/statistics/rx_bytes /usr/local/bin/system/rx_actual
cp /sys/class/net/eth0/statistics/tx_bytes /usr/local/bin/system/tx_actual
cp /sys/class/net/wlan0/statistics/rx_bytes /usr/local/bin/system/wlan_rx_actual
cp /sys/class/net/wlan0/statistics/tx_bytes /usr/local/bin/system/wlan_tx_actual
# BYTES FILES
if [ ! -e /usr/local/bin/system/rx_bytes ]; then # IF RX_BYTES DOESN'T EXIST
cp /usr/local/bin/system/rx_actual /usr/local/bin/system/rx_bytes # MAKE A NEW COPY FROM THE ACTUAL FILE
else
mv /usr/local/bin/system/rx_bytes /usr/local/bin/system/rx_bytes_old # IF IT DOES EXIST, RENAME IT
cp /usr/local/bin/system/rx_actual /usr/local/bin/system/rx_bytes # AND COPY IN A NEW ONE
fi
if [ ! -e /usr/local/bin/system/tx_bytes ]; then # REPEAT THIS FOR TX_BYTES
cp /usr/local/bin/system/tx_actual /usr/local/bin/system/tx_bytes
else
mv /usr/local/bin/system/tx_bytes /usr/local/bin/system/tx_bytes_old
cp /usr/local/bin/system/tx_actual /usr/local/bin/system/tx_bytes
fi
# BYTES FILES (WLAN0)
if [ ! -e /usr/local/bin/system/wlan_rx_bytes ]; then # IF RX_BYTES DOESN'T EXIST
cp /usr/local/bin/system/wlan_rx_actual /usr/local/bin/system/wlan_rx_bytes # MAKE A NEW COPY FROM THE ACTUAL FILE
else
mv /usr/local/bin/system/wlan_rx_bytes /usr/local/bin/system/wlan_rx_bytes_old # IF IT DOES EXIST, RENAME IT
cp /usr/local/bin/system/wlan_rx_actual /usr/local/bin/system/wlan_rx_bytes # AND COPY IN A NEW ONE
fi
if [ ! -e /usr/local/bin/system/wlan_tx_bytes ]; then # REPEAT THIS FOR TX_BYTES
cp /usr/local/bin/system/wlan_tx_actual /usr/local/bin/system/wlan_tx_bytes
else
mv /usr/local/bin/system/wlan_tx_bytes /usr/local/bin/system/wlan_tx_bytes_old
cp /usr/local/bin/system/wlan_tx_actual /usr/local/bin/system/wlan_tx_bytes
fi
# RUNNING TOTAL FILES
if [ ! -e /usr/local/bin/system/rx_running ]; then
cp /usr/local/bin/system/rx_bytes /usr/local/bin/system/rx_running
fi
if [ ! -e /usr/local/bin/system/tx_running ]; then
cp /usr/local/bin/system/tx_bytes /usr/local/bin/system/tx_running
fi
# RUNNING TOTAL FILES (WLAN0)
if [ ! -e /usr/local/bin/system/wlan_rx_running ]; then
cp /usr/local/bin/system/wlan_rx_bytes /usr/local/bin/system/wlan_rx_running
fi
if [ ! -e /usr/local/bin/system/wlan_tx_running ]; then
cp /usr/local/bin/system/wlan_tx_bytes /usr/local/bin/system/wlan_tx_running
fi
# OLD FILES
if [ ! -e /usr/local/bin/system/rx_bytes_old ]; then
cp /usr/local/bin/system/rx_bytes /usr/local/bin/system/rx_bytes_old
fi
if [ ! -e /usr/local/bin/system/tx_bytes_old ]; then
cp /usr/local/bin/system/tx_bytes /usr/local/bin/system/tx_bytes_old
fi
# OLD FILES (WLAN0)
if [ ! -e /usr/local/bin/system/wlan_rx_bytes_old ]; then
cp /usr/local/bin/system/wlan_rx_bytes /usr/local/bin/system/wlan_rx_bytes_old
fi
if [ ! -e /usr/local/bin/system/wlan_tx_bytes_old ]; then
cp /usr/local/bin/system/wlan_tx_bytes /usr/local/bin/system/wlan_tx_bytes_old
fi
# SET VARIABLES FOR CALCULATION
OLDRX=`cat /usr/local/bin/system/rx_bytes_old`
NEWRX=`cat /usr/local/bin/system/rx_bytes`
RUNRX=`cat /usr/local/bin/system/rx_running`
OLDTX=`cat /usr/local/bin/system/tx_bytes_old`
NEWTX=`cat /usr/local/bin/system/tx_bytes`
RUNTX=`cat /usr/local/bin/system/tx_running`
OLDWRX=`cat /usr/local/bin/system/wlan_rx_bytes_old`
NEWWRX=`cat /usr/local/bin/system/wlan_rx_bytes`
RUNWRX=`cat /usr/local/bin/system/wlan_rx_running`
OLDWTX=`cat /usr/local/bin/system/wlan_tx_bytes_old`
NEWWTX=`cat /usr/local/bin/system/wlan_tx_bytes`
RUNWTX=`cat /usr/local/bin/system/wlan_tx_running`
MAX=4294967296
# COMPARE AND DO MATH
if [ $NEWRX -lt $OLDRX ]; then # IF NEW VALUE IS LESS THAN OLD VALUE (max reached and LOOPED AROUND)
TOPRX=`expr $MAX - $OLDRX` # SUBTRACT THE OLD VALUE FROM THE MAX VALUE
USERX=`expr $TOPRX + $RUNRX` # ADD IT TO RUNNING TOTAL
$USERX=`expr $USERX + $NEWRX` # ADD THAT TO THE NEW VALUE
echo $USERX > /usr/local/bin/system/rx_running # OUTPUT THAT TO THE NEW RUNNING TOTAL
else # OTHERWISE (it hasn't looped around)
TOPRX=`expr $NEWRX - $OLDRX` # SUBTRACT THE OLD VALUE FROM THE NEW
USERX=`expr $RUNRX + $TOPRX` # ADD IT TO THE RUNNING VALUE
echo $USERX > /usr/local/bin/system/rx_running # OUTPUT THAT TO THE NEW RUNNING TOTAL
fi
if [ $NEWTX -lt $OLDTX ]; then # REPEAT ABOVE FOR UPLOADS
TOPTX=`expr $MAX - $OLDTX`
USETX=`expr $TOPTX + $RUNTX`
$USETX=`expr $USETX + $NEWTX`
echo $USETX > /usr/local/bin/system/tx_running
else
TOPTX=`expr $NEWTX - $OLDTX`
USETX=`expr $RUNTX + $TOPTX`
echo $USETX > /usr/local/bin/system/tx_running
fi
#COMPARE AND DO MATH (WLAN0)
if [ $NEWWRX -lt $OLDWRX ]; then # IF NEW VALUE IS LESS THAN OLD VALUE (max reached and LOOPED AROUND)
TOPWRX=`expr $MAX - $OLDWRX` # SUBTRACT THE OLD VALUE FROM THE MAX VALUE
USEWRX=`expr $TOPWRX + $RUNWRX` # ADD IT TO RUNNING TOTAL
$USEWRX=`expr $USEWRX + $NEWWRX` # ADD THAT TO THE NEW VALUE
echo $USEWRX > /usr/local/bin/system/wlan_rx_running # OUTPUT THAT TO THE NEW RUNNING TOTAL
else # OTHERWISE (it hasn't looped around)
TOPWRX=`expr $NEWWRX - $OLDWRX` # SUBTRACT THE OLD VALUE FROM THE NEW
USEWRX=`expr $RUNWRX + $TOPWRX` # ADD IT TO THE RUNNING VALUE
echo $USEWRX > /usr/local/bin/system/wlan_rx_running # OUTPUT THAT TO THE NEW RUNNING TOTAL
fi
if [ $NEWWTX -lt $OLDWTX ]; then # REPEAT ABOVE FOR UPLOADS
TOPWTX=`expr $MAX - $OLDWTX`
USEWTX=`expr $TOPWTX + $RUNWTX`
$USEWTX=`expr $USEWTX + $NEWWTX`
echo $USEWTX > /usr/local/bin/system/wlan_tx_running
else
TOPWTX=`expr $NEWWTX - $OLDWTX`
USEWTX=`expr $RUNWTX + $TOPWTX`
echo $USEWTX > /usr/local/bin/system/wlan_tx_running
fi
Это создаст несколько файлов в системном каталоге, однако фактические итоги будут находиться в следующих файлах:
/usr/local/bin/system/rx_running
- общее количество байт, загруженных на eth0
/usr/local/bin/system/tx_running
- общее количество байт, загруженных на eth0
/usr/local/bin/system/wlan_rx_running
- общее количество байт, загруженных на wlan0
/usr/local/bin/system/wlan_tx_running
- общее количество байт, загруженных на wlan0
Естественно, вы захотите обновлять эти значения автоматически. Поэтому я рекомендую запускать скрипт периодически (я делаю это раз в минуту, используя cron
с * * * * * * chronic /usr/local/bin/system/getStats.sh
После этого я продолжил получать другие статистические данные, включая средние значения нагрузки, температуру CPU, использование памяти и т.д. и выводить их на графики с помощью RRDTool
.
Этот график демонстрирует тот факт, что 32-битная ОС (raspberry Pi2 под управлением Jessie) все еще может дать вам полезные переданные данные, превышающие 4Gb:
P.S. chronic
- это часть пакета moreutils
, которая позволяет вам запустить команду, которая не выведет ничего, пока не возникнет ошибка.