0
2

More than 3 years have passed since last update.

Linuxでライブラリを使わず通信量を取得しよう

Last updated at Posted at 2020-09-03

はじめに

 こんばんは、麻菜結です。最近ツイッターでつぶやいた


これを実現していくうえで得た様々な知見に関して書いていこうのやつです。
 今回は置時計に表示する通信量データを、ライブラリを使わずゴリゴリ取得したやつです。

環境

Raspbian64bit

Linux asana 5.4.51-v8+ #1333 SMP PREEMPT Mon Aug 10 16:58:35 BST 2020 aarch64 GNU/Linux

Debian系の傍流です。あんまりこの辺は気にしなくてよさそう。

やりかた

/proc/net/devにアクセスしてみるだけです。結構わかりやすく書いてある。

$ cat /proc/net/dev
Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
    lo:    9120     152    0    0    0     0          0         0     9120     152    0    0    0     0       0          0
 wlan0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
  eth0: 2265270920 1920829    0    0    0     0          0      8753 2436031286 2437082    0    0    0     0       0          0

左側は受け取った通信、右側は送り出した通信です。それぞれの行からインターフェースを選んで、バイト数なりパケット数なりを切り取っていけばよい訳です。ここで表示される数は起動してからの累計の数なので、もし『今どのくらい通信しているかのグラフを作成したい』となったら、前の数値との比較を行えばいいわけですね。

実際の取得例

Python3.7.3でやってみます。いわゆるwith句が使えるやつにしましょう。
今回は、古い値と新しい値を比較して差を標準出力するプログラムを作成してみます。
0.5秒間隔で出力するので、適当な所でCtrl+Cで止めてください。

print_traffic.py
from time import sleep

data = []
now = [0, 0]
old = [0, 0]
interface = "eth0"

try:
    while(True):
        with open("/proc/net/dev", mode="r") as f:
            for l in f.readlines():
                if(interface in l):
                    data = [e for e in l.split(" ") if e != ""]
        now = [int(data[1]), int(data[9])]
        print(f"Receive:  {now[0] - old[0]} Byte Transmit: {now[1] - old[1]} Byte")
        old = now
        sleep(0.5)
except KeyboardInterrupt:
    pass

出力結果
$ python3 print_traffic.py
Receive:  2268743515 Byte Transmit: 3012744264 Byte
Receive:  60 Byte Transmit: 146 Byte
Receive:  60 Byte Transmit: 130 Byte
Receive:  60 Byte Transmit: 130 Byte
Receive:  222 Byte Transmit: 275 Byte
^C

 0番目の値がはねていますが、初期値が0の為です。ちゃんとしたグラフアプリケーションを作る人はエラー値として消しておくと無難だとおもいます。
 ちなみに、スクリプトの内包表記の部分の処理、一回実行してみればわかりますが、このように書くと、その行の空白を除いた、インターフェース名と数値だけのリストになるので便利です。そのあとお好きな値を取り出してみてください。

終わりに

 今回は、知ってる人にとってはLinuxの基礎の基礎みたいなところから記事を作りました。もちろんLinuxUnix弱者の私は最近知ったわけですが。ラズパイの5インチのディスプレイを買ったとたんいろんな使い道が思いついてやばいですね。これ系統で記事がいっぱいかけそう。なお


のCPUとメモリ部分はpsutilライブラリを使いました。この記事の意味が問われます。(画像の通信量部分はこの記事のモノと仕様が異なります。)
 ここまで読んでくださってありがとうございました。お役に立てたならば幸いです。
0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2