有时我们需要较为实时的查看服务器上的网卡流量,这里我写了两个小脚本,一个用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,如需转载请自行联系原作者