我正在跟踪网络接口上的数据传输,但希望将它们重置为0
每月 1 日。
当我尝试echo 0
或rx_bytes
文件时tx_bytes
,我得到以下信息:
bash: /sys/class/net/wlan0/statistics/rx_bytes: Permission denied
我以 root 身份运行该命令。
我还尝试复制(覆盖)文件:
cp: cannot create regular file:‘/sys/class/net/wlan0/statistics/rx_bytes’: Permission denied
我还尝试将权限更改为777
(默认为444
)
答案1
通常的方法是在月份变化时保存该值,并计算与该值的差异。通过这种方式,您可以轻松地对多个时间间隔内的值进行计数,并且还可以将单个数据源与多个独立的消费者一起使用,而无需他们踩踏彼此的数字。此外,将计数器清零需要一种自动读取和清除计数器的方法,否则您将丢失读取计数器和将其清零之间的流量计数。像 SNMP 这样的东西通常也会给你一个只读计数器。
所以我不认为你真的想清理柜台。
为绘制网络统计数据而设计的程序通常可以处理环绕问题(例如rrdtool
具有COUNTER
模式)。尽管您仍然想使用 64 位计数器,因为我记得使用千兆位接口和 5 分钟轮询率时遇到过 32 位溢出问题。
答案2
您正在执行的文件操作操作可能不起作用,因为 /proc 中的文件并不是常识中真正的文件,而是为 Linux 内核中的变量提供“窗口”/接口的虚拟文件。
重置接口计数器的唯一方法是卸载并再次加载相应的接口内核模块。
找出eth0的内核模块:
$sudo ethtool -i eth0 | grep driver
driver: vmxnet3
然后卸载并加载内核模块:
sudo -- sh -c 'ifdown eth0 ; modprobe -r vmxnet3; modprobe vmxnet3 ; ifup eth0'
如果您不使用上述 sudo 语法,我建议您使用上述命令创建一个脚本,否则在某些情况下您可能会失去对远程 Linux 计算机的控制。
请注意,如果您有监视 eth0 的进程(例如看门狗),您也必须在卸载模块之前停止它们。
答案3
好的,所以就我而言,强制重置计数器的唯一方法是重新启动服务器。并不理想,但情况就是如此。
正如所提到的伊尔卡丘,最好的方法可能是在新月初保存该值,然后从该点开始计算。然而,我无法用我当前设置的脚本以一种优雅的方式来完成此任务。
因此,我选择了每月重新启动一次我的服务器的方案。我在下面包含了我使用的代码片段:
# 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