天天看点

查看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,如需转载请自行联系原作者