天天看點

檢視Linux伺服器網卡流量小腳本shell和Python各一例

  有時我們需要較為實時的檢視伺服器上的網卡流量,這裡我寫了兩個小腳本,一個用shell(先寫的,一次隻能檢視一個網卡),另一個用Python(後寫的,一次可檢視多個網卡)。腳本中都用了while true“死循環”,每隔10s從“/proc/net/dev”中取一次值并根據10s内的內插補點計算10s内的平均帶寬;按ctrl+c停止執行。腳本相容centos6和7

兩個腳本都不太複雜,而且腳本中注釋也比較細緻,是以我就不過多解釋腳本内容了。直接上圖上腳本:

shell版--使用截圖:

<a href="http://s3.51cto.com/wyfs02/M00/81/FD/wKiom1dGtVjC0q0TAABf9C5ErSY496.png" target="_blank"></a>

shell版代碼:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

<code>#!/bin/sh</code>

<code>#by ljk 20160526</code>

<code>if</code> <code>[ </code><code>"$1"</code> <code>= </code><code>""</code> <code>];</code><code>then</code>    <code>#判斷後面是否有跟參數</code>

<code>    </code><code>echo</code> <code>-e </code><code>"\n      use interface_name after the script,like \"script eth0\"...\n"</code>

<code>    </code><code>exit</code> <code>-1</code>

<code>fi</code>

<code>echo</code> <code>-e </code><code>"\n      start monitoring the $1,press \"ctrl+c\" to stop"</code>

<code>echo</code> <code>----------------------------------------------------------</code>

<code>file</code><code>=</code><code>/proc/net/dev</code>    <code>#核心網卡資訊檔案</code>

<code>while</code> <code>true</code>

<code>    </code><code>do</code>

<code>    </code><code>RX_bytes=`</code><code>cat</code> <code>$</code><code>file</code><code>|</code><code>grep</code> <code>$1|</code><code>sed</code> <code>'s/^ *//g'</code><code>|</code><code>awk</code> <code>-F</code><code>'[ :]+'</code> <code>'{print $2}'</code><code>`    </code><code>#這裡sed這一步為了同時相容centos6和7</code>

<code>    </code><code>TX_bytes=`</code><code>cat</code> <code>$</code><code>file</code><code>|</code><code>grep</code> <code>$1|</code><code>sed</code> <code>'s/^ *//g'</code><code>|</code><code>awk</code> <code>-F</code><code>'[ :]+'</code> <code>'{print $10}'</code><code>`</code>

<code>    </code><code>sleep</code> <code>10</code>

<code>    </code><code>RX_bytes_later=`</code><code>cat</code> <code>$</code><code>file</code><code>|</code><code>grep</code> <code>$1|</code><code>sed</code> <code>'s/^ *//g'</code><code>|</code><code>awk</code> <code>-F</code><code>'[ :]+'</code> <code>'{print $2}'</code><code>`</code>

<code>    </code><code>TX_bytes_later=`</code><code>cat</code> <code>$</code><code>file</code><code>|</code><code>grep</code> <code>$1|</code><code>sed</code> <code>'s/^ *//g'</code><code>|</code><code>awk</code> <code>-F</code><code>'[ :]+'</code> <code>'{print $10}'</code><code>`</code>

<code>    </code><code>#B*8/1024/1024=Mb</code>

<code>    </code><code>speed_RX=`</code><code>echo</code> <code>"scale=2;($RX_bytes_later - $RX_bytes)*8/1024/1024/10"</code><code>|</code><code>bc</code><code>`</code>

<code>    </code><code>speed_TX=`</code><code>echo</code> <code>"scale=2;($TX_bytes_later - $TX_bytes)*8/1024/1024/10"</code><code>|</code><code>bc</code><code>`</code>

<code>    </code><code>printf</code> <code>"%-3s %-3.1f %-10s %-4s %-3.1f %-4s\n"</code> <code>IN: $speed_RX Mb</code><code>/s</code> <code>OUT: $speed_TX Mb</code><code>/s</code>

<code>done</code>

Python版--使用截圖:

Python版代碼:

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

<code>#!/bin/env python3</code>

<code>import</code> <code>os,re,sys,time</code>

<code>if</code> <code>len</code><code>(sys.argv) </code><code>=</code><code>=</code> <code>1</code><code>:</code>

<code>    </code><code>print</code><code>(</code><code>'\n使用方法:請跟上網卡名稱,可接"單個網卡"/"多個網卡,以空格分開".\n'</code><code>)</code>

<code>    </code><code>sys.exit(</code><code>100</code><code>)</code>

<code>else</code><code>:</code>

<code>    </code><code>print</code><code>(</code><code>'start monitoring,press "ctrl+c" to stop\n'</code><code>)</code>

<code>    </code><code>for</code> <code>arg </code><code>in</code> <code>sys.argv[</code><code>1</code><code>:]:    </code><code>#輸出标頭</code>

<code>        </code><code>header </code><code>=</code> <code>'------{} bandwidth(Mb/s)------'</code><code>.</code><code>format</code><code>(arg)</code>

<code>        </code><code>print</code><code>(header.ljust(</code><code>35</code><code>),end</code><code>=</code><code>'')</code>

<code>    </code><code>print</code><code>()</code>

<code>    </code><code>#global values_dic</code>

<code>    </code><code>values_dic </code><code>=</code> <code>{}    </code><code>#定義空字典,用來在下面函數中存放各網卡的各項需要用到的值</code>

<code>    </code><code>def</code> <code>get_values(orders):</code>

<code>        </code><code>try</code><code>:</code>

<code>            </code><code>with </code><code>open</code><code>(</code><code>'/proc/net/dev'</code><code>) as f:</code>

<code>                </code><code>lines</code><code>=</code><code>f.readlines()    </code><code>#内容不多,一次性讀取較友善</code>

<code>                </code><code>for</code> <code>arg </code><code>in</code> <code>sys.argv[</code><code>1</code><code>:]:</code>

<code>                    </code><code>for</code> <code>line </code><code>in</code> <code>lines:</code>

<code>                        </code><code>line</code><code>=</code><code>line.lstrip()    </code><code>#去掉行首的空格,以便下面split</code>

<code>                        </code><code>if</code> <code>re.match(arg,line):</code>

<code>                            </code><code>values </code><code>=</code> <code>re.split(</code><code>"[ :]+"</code><code>,line)    </code><code>#以空格和:作為分隔符</code>

<code>                            </code><code>values_dic[arg</code><code>+</code><code>'r'</code><code>+</code><code>orders]</code><code>=</code><code>values[</code><code>1</code><code>]    </code><code>#1為接收值</code>

<code>                            </code><code>values_dic[arg</code><code>+</code><code>'t'</code><code>+</code><code>orders]</code><code>=</code><code>values[</code><code>9</code><code>]    </code><code>#9為發送值</code>

<code>                            </code><code>#return [values[1],values[9]]    #可傳回清單</code>

<code>        </code><code>except</code> <code>(FileExistsError,FileNotFoundError,PermissionError):</code>

<code>            </code><code>print</code><code>(</code><code>'open file error'</code><code>)</code>

<code>            </code><code>sys.exit(</code><code>-</code><code>1</code><code>)</code>

<code>    </code><code>try</code><code>:</code>

<code>        </code><code>while</code> <code>True</code><code>:</code>

<code>            </code><code>get_values(</code><code>'first'</code><code>)    </code><code>#第一次取值</code>

<code>            </code><code>time.sleep(</code><code>10</code><code>)</code>

<code>            </code><code>get_values(</code><code>'second'</code><code>)    </code><code>#10s後第二次取值</code>

<code>            </code><code>for</code> <code>arg </code><code>in</code> <code>sys.argv[</code><code>1</code><code>:]:</code>

<code>                </code><code>r_bandwidth </code><code>=</code> <code>(</code><code>int</code><code>(values_dic[arg</code><code>+</code><code>'r'</code><code>+</code><code>'second'</code><code>]) </code><code>-</code> <code>int</code><code>(values_dic[arg</code><code>+</code><code>'r'</code><code>+</code><code>'first'</code><code>]))</code><code>/</code><code>1024</code><code>/</code><code>1024</code><code>/</code><code>10</code><code>*</code><code>8</code>

<code>                </code><code>t_bandwidth </code><code>=</code> <code>(</code><code>int</code><code>(values_dic[arg</code><code>+</code><code>'t'</code><code>+</code><code>'second'</code><code>]) </code><code>-</code> <code>int</code><code>(values_dic[arg</code><code>+</code><code>'t'</code><code>+</code><code>'first'</code><code>]))</code><code>/</code><code>1024</code><code>/</code><code>1024</code><code>/</code><code>10</code><code>*</code><code>8</code>

<code>                </code><code>print</code><code>(</code><code>'IN: '</code><code>+</code><code>str</code><code>(</code><code>round</code><code>(r_bandwidth,</code><code>2</code><code>)).ljust(</code><code>8</code><code>)</code><code>+</code><code>'  OUT: '</code><code>+</code><code>str</code><code>(</code><code>round</code><code>(t_bandwidth,</code><code>2</code><code>)).ljust(</code><code>16</code><code>),end</code><code>=</code><code>'')</code>

<code>            </code><code>print</code><code>()</code>

<code>            </code><code>values_dic </code><code>=</code> <code>{}    </code><code>#清空本次循環後字典的内容</code>

<code>    </code><code>except</code> <code>KeyboardInterrupt:</code>

<code>        </code><code>print</code><code>(</code><code>"\n-----bye-----"</code><code>)</code>

這倆腳本使用起來都還是很友善實用的,共享出來希望能給朋友們工作中帶來一點友善。

     本文轉自kai404 51CTO部落格,原文連結:http://blog.51cto.com/kaifly/1783530,如需轉載請自行聯系原作者