其實,如果僅僅是要看這個流量,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,如需轉載請自行聯系原作者