有時我們需要較為實時的檢視伺服器上的網卡流量,這裡我寫了兩個小腳本,一個用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,如需轉載請自行聯系原作者