ネットワークインターフェイスでデータ転送を追跡していますが、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を監視するプロセス(watchdogなど)がある場合は、モジュールを削除する前にそのプロセスも停止する必要があります。
答え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