其实,如果仅仅是要看这个流量,iftop这个软件就很好,通过其自身的选项就能满足了,不需要再做什么额外的工作。
我的情况是:由于nfs客户机众多,而且虽是挂载一台存储设备但挂载点ip却不一样,并且我想把这个作为一个监控项放到zabbix里,所以我就需要用shell对iftop做进一步的“封装”,以便能够“通用”些且更好的和zabbix结合。
注意:iftop需要root权限,而zabbix-agent一般是以zabbix用户运行且通过zabbix-server调用agent端的自定义脚本时是没有终端(tty)的,这里就需要修改sudo的配置文件了,允许zabbix用户远程执行命令的过程中执行sudo操作。
脚本内容如下
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<code>#!/bin/sh</code>
<code>#在zabbix上监控各机器与nfs server之间的流量</code>
<code>#by ljk 20160803</code>
<code>net=</code><code>'192.168.1.*'</code> <code>#内网网段</code>
<code>nfs_subnet=</code><code>'192.168.1.2[0-9]{2}'</code> <code>#nfs所在ip的正则</code>
<code>#获取nfs server的真实ip,前提是每台server无论几个挂载点,都只从一个ip挂载</code>
<code>nfs_ip=$(</code><code>df</code> <code>-h|</code><code>egrep</code> <code>"$nfs_subnet:"</code><code>|</code><code>awk</code> <code>-F : </code><code>'{print $1}'</code><code>|</code><code>sort</code><code>|</code><code>uniq</code><code>)</code>
<code>cd</code> <code>/etc/sysconfig/network-scripts</code>
<code>for</code> <code>dev </code><code>in</code> <code>$(</code><code>ls</code> <code>ifcfg-*|</code><code>awk</code> <code>-F - </code><code>'{print $2}'</code><code>);</code><code>do</code>
<code> </code><code>ip addr show $dev|</code><code>grep</code> <code>'192.168.1.*'</code> <code>></code><code>/dev/null</code> <code>#判断哪个网卡有内网网段ip</code>
<code> </code><code>if</code> <code>[ $? -</code><code>eq</code> <code>0 ];</code><code>then</code>
<code> </code><code>using_dev=$dev </code><code>#拥有内网ip的网卡名赋予变量using_dev</code>
<code> </code><code>break</code>
<code> </code><code>fi</code>
<code>done</code>
<code>if</code> <code>[ </code><code>"$1"</code> <code>== </code><code>"request"</code> <code>];</code><code>then</code>
<code> </code><code>result=$(</code><code>sudo</code> <code>iftop -i $using_dev -n -t -s 10 2></code><code>/dev/null</code> <code>| </code><code>egrep</code> <code>-B 1 $nfs_ip|</code><code>awk</code> <code>'$(NF-4)=="=>" {print $(NF-1)}'</code><code>)</code>
<code>elif</code> <code>[ </code><code>"$1"</code> <code>== </code><code>"response"</code> <code>];</code><code>then</code>
<code> </code><code>result=$(</code><code>sudo</code> <code>iftop -i $using_dev -n -t -s 10 2></code><code>/dev/null</code> <code>| </code><code>egrep</code> <code>-B 1 $nfs_ip|</code><code>awk</code> <code>'$(NF-4)=="<=" {print $(NF-1)}'</code><code>)</code>
<code>fi</code>
<code>#下面部分是为了适用于zabbix而做的一些额外的工作</code>
<code>#iftop出来的结果为(6.60Mb 208Kb 320b等),将其结果整合进zabbix时要去掉这些单位并对数值做转换(zabbix里我统一用b做单位,只给zabbix传数值)</code>
<code>if</code> <code>[ -z </code><code>"$result"</code> <code>];</code><code>then</code>
<code> </code><code>echo</code> <code>0</code>
<code>else</code>
<code> </code><code>num=$(</code><code>echo</code> <code>$result|</code><code>tr</code> <code>-d </code><code>"a-zA-Z"</code><code>)</code>
<code> </code><code>unit=`</code><code>echo</code> <code>${result: -2:1}`</code>
<code> </code><code>case</code> <code>$unit </code><code>in</code>
<code> </code><code>[kK]) </code><code>echo</code> <code>"$num*1024"</code><code>|</code><code>bc</code><code>;;</code>
<code> </code><code>[mM]) </code><code>echo</code> <code>"$num*1024*1024"</code><code>|</code><code>bc</code><code>;;</code>
<code> </code><code>[gG]) </code><code>echo</code> <code>"$num*1024*1024*1024"</code><code>|</code><code>bc</code><code>;;</code>
<code> </code><code>*) </code><code>echo</code> <code>"$num"</code>
<code> </code><code>esac</code>
<code></code>
本文转自kai404 51CTO博客,原文链接:http://blog.51cto.com/kaifly/1840121,如需转载请自行联系原作者