Como forçar o rx_bytes e o tx_bytes a serem redefinidos?

2

Estou acompanhando as transferências de dados nas minhas interfaces de rede, mas quero que elas sejam redefinidas para 0 no primeiro dia de cada mês.

Quando eu tento echo 0 para os arquivos rx_bytes ou tx_bytes , recebo isso:

bash: /sys/class/net/wlan0/statistics/rx_bytes: Permission denied

Eu corro o comando como root.

Eu também tentei copiar (sobrescrever) em um arquivo:

cp: cannot create regular file:‘/sys/class/net/wlan0/statistics/rx_bytes’: Permission denied

Eu também tentei alterar as permissões para 777 (o padrão é 444 )

    
por Jim 07.07.2016 / 12:07

3 respostas

2

As operações de manipulação de arquivos que você está executando podem não estar funcionando, porque arquivos em / proc não são arquivos verdadeiros no sentido comum, mas arquivos virtuais que fornecem uma 'janela' / interface para variáveis no kernel linux.

A única maneira de redefinir os contadores de interface é descarregando e carregando novamente o módulo do kernel da interface correspondente.

Para descobrir o módulo do kernel da eth0:

$sudo ethtool -i eth0 | grep driver
driver: vmxnet3

Em seguida, descarregue e carregue o módulo do kernel com:

sudo -- sh -c  'ifdown eth0 ; modprobe -r vmxnet3; modprobe vmxnet3 ; ifup eth0'

se você não usar a sintaxe sudo acima, eu recomendo criar um script com os comandos acima, ou você pode, em certas condições, perder o controle da máquina Linux remota.

Esteja ciente de que se você tiver processos monitorando eth0, por exemplo watchdog, você terá que pará-los também antes de descarregar o módulo.

    
por 07.07.2016 / 12:48
2

A maneira usual seria salvar o valor na mudança do mês e calcular as diferenças em relação a esse valor. Dessa forma, você poderia facilmente dizer valores de contagem em mais de um intervalo e também tornar possível usar uma única fonte de dados com vários consumidores independentes, sem que eles pisassem nos números uns dos outros. Além disso, zerar o contador exigiria uma maneira de ler e limpar atomicamente, caso contrário, você perderia a contagem do tráfego entre a leitura do contador e o zeramento. Coisas como o SNMP geralmente também fornecem um contador somente para leitura.

Então, não acho que você queira realmente limpar o contador.

Os programas projetados para representar graficamente estatísticas de rede geralmente podem lidar com o problema de encadernação (por exemplo, rrdtool tem COUNTER mode). Embora você ainda queira usar contadores de 64 bits, já que lembro de ter problemas com estouro de 32 bits com uma interface de gigabit e uma taxa de pesquisa de 5 minutos.

    
por 07.07.2016 / 15:04
0

Ok, então, no meu caso, a única maneira de forçar os contadores a reiniciar seria reinicializar o servidor. Não é o ideal, mas esse é o caso.

Como mencionado por ilkkachu , provavelmente a melhor maneira de fazer isso seria salvar o valor no início do novo mês e, em seguida, calcular a partir desse ponto em diante. No entanto, eu não poderia envolver minha cabeça em torno de uma maneira elegante de conseguir isso com o script que eu configurei atualmente.

Então, em vez disso, eu fui para o cenário de reiniciar meu servidor uma vez por mês. Eu incluí um trecho do código que usei abaixo:

# CHECK FOR THE OLD_MONTH FILE
if [ ! -e /usr/local/bin/system/old_month ]; then
        # CREATE IT IF IT DOESN'T EXIST WITH THIS MONTHS DATE
        echo 'date' | awk '{print $2,$6}' > /usr/local/bin/system/old_month
fi

# CREATE A NEW FILE EVERY TIME THIS IS RUN WITH THIS MONTHS DATE
echo 'date' | awk '{print $2,$6}' > /usr/local/bin/system/this_month

# CHECK IF OLD_MONTH AND THIS_MONTH ARE NOT THE SAME
if ! cmp /usr/local/bin/system/this_month /usr/local/bin/system/old_month > /dev/null 2>&1 ;
then
        # RUN YOUR RELEVANT CODE HERE #
        echo 'date' | awk '{print $2,$6}' > /usr/local/bin/system/old_month     # UPDATE THE VALUE IN OLD_MONTH SO THAT THEY WILL MATCH NEXT TIME
        reboot now                                                              # REBOOT
        exit 0                                                                  # AND EXIT THIS SCRIPT
fi
    
por 21.07.2016 / 16:52