網絡流量的監控工具有很多,如:Mrtg、Cacti、Zabbix等等,他們都有著各自的特點,不同的側重,只為適合不同的應用場景的各種特殊需求。除了網絡流量監控工具以外,還有Nagios這樣的監控主機狀態的工具,不僅能有效監控Windows、Linux和Unix的主機狀態,交換機路由器等網絡設置,打印機等。還能在系統或服務狀態異常時發出郵件或短信報警第一時間通知網站運維人員,在狀態恢復後發出正常的郵件或短信通知等功能。除此之外Nagios簡單地插件設計使得用戶可以方便地擴展自己服務的檢測方法。也正是這一點,讓Nagios幾乎無所不能。我們也經常利用這個特性,使用Shell編寫各類插件配合Ngios的使用。
Nagios雖然強大,但無法像Cacti那樣圖形化監控網絡流量。因此Nagios+Cacti通過NPC整合在一起,強強聯手成為了一種經常被使用的組合。關於這方面的知識,我會在後續的博客中有所描述,此處暫略過。只為圖形化流量使用情況就要在學習Cacti的同時,還要將Nagios與Cacti進行整合,成本未免太高。有沒有一種方式可以自定義網絡流量監控並以圖形化的方式顯示出來呢?本文就是利用Shell配合繪圖工具GnuPlot將網絡流量圖形化的展示出來,大家可以將他嵌入到Nagios或者干脆單獨使用。
首先我們需要獲得網絡流量。運行ifconfig命令
eth0 Link encap:Ethernet HWaddr 00:0C:29:58:A5:D5
inet addr:192.168.0.15 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe58:a5d5/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:7 errors:0 dropped:0 overruns:0 frame:0
TX packets:16 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:496 (496.0 b) TX bytes:2452 (2.3 KiB)
Interrupt:193 Base address:0x2000
其中 RX Bytes、TX Bytes:為總傳送、接收的字節總量(紅色標注部分)。我們將其取出並相加。命令如下:
ifconfig | awk -F ":" 'NR==8{print $2+$3}' (本例獲得結果為2948,單位為byte)
我們將以分鐘為單位取得該值並與之前取得值的總和相減得到每分鐘的網卡流量並導入到文本文件中。文件的格式如下:
06:01:00 2948
06:02:00 1948
06:03:00 2948
06:04:00 3948
06:05:00 1948
06:06:00 3948
........
echo -n `date +%H:%M:%S` " " >> result;echo $[`ifconfig | awk -F ":" 'NR==8{print $2+$3}'`-`awk '{sum+=$2}END{print sum}' result `] >>result
echo -n `date +%H:%M:%S` " " >> 1; #以小時:分鐘:秒為格式獲取當前系統時間並輸出重定向到result文件中,-n選項為不輸出換行符。
awk '{sum+=$2}END{print sum}' result #為獲得result文件中第二列所有值的和
echo $[`ifconfig | awk -F ":" 'NR==8{print $2+$3}'`-`awk '{sum+=$2}END{print sum}' result `]>>result #將當前網卡流量減去之前統計的網
卡流量總和得到這一分鐘內網卡的流量並將其輸出重定向到result文件中。
#! /bin/bash
while true;do
echo -n `date +%H:%M:%S` " " >> result;echo $[`ifconfig | awk -F ":" 'NR==8{print $2+$3}'`-`awk '{sum+=$2}END{print sum}' result `]>>result
sleep 60
done
reslut文件內容如下:
06:31:01 2948
06:32:01 1948
06:33:01 2948
06:34:01 3948
06:35:01 1948
06:36:01 3948
06:37:01 2680
06:38:01 3127
06:39:01 4162
06:40:01 5137
06:41:01 1348
06:42:01 1872
06:43:01 2882
06:44:01 1972
06:45:01 5689
06:46:01 1952
06:47:01 2371
06:48:01 3333
06:49:01 4523
06:50:01 1346
06:51:01 7864
06:52:01 3256
06:53:01 5742
06:54:01 1234
06:55:01 4328
06:56:01 2651
06:57:01 1463
06:58:01 2813
06:59:01 1111
07:00:01 2134
07:01:01 1687
07:02:01 3383
07:03:01 2345
現在我們就可以通過GnuPlot進行繪圖。
set terminal png small color picsize 600 400 #以png格式,坐標字體為小字體,大小為600*400輸出繪圖
set output "eth0.png" #輸出圖片的名稱為eth0.png
set xdata time #設定X坐標的類型為時間類型
set timefmt "%H:%M:%S" #設定時間類型的格式
set grid #設定網格為輸出圖片背景
set style data linespoints #設定繪圖使用點線方式
set xtic rotate by 90 #將X坐標以90旋轉
plot "result" using 1:2 title "eth0" pointtype 3 linetype 2#以result文件的一列為X坐標繪制第二列的內容,圖片右上角標示為eth0
將以上內容保存為文件eth0
cat eth0 | gnuplot #執行繪圖
本例輸出的圖片如下:
完整shell腳本如下:
#! /bin/bash
while true;do
echo -n `date +%H:%M:%S` " " >> result;echo $[`ifconfig | awk -F ":" 'NR==8{print $2+$3}'`-`awk '{sum+=$2}END{print sum}' result `]>>result
cat eth0 | gnuplot #由於每次生成的圖片會覆蓋原來的圖片,所以不用進行刪除操作
sleep 60
done
生成好的圖片可以放置在Apache中或者整合Nagios。 篇幅有限,未盡之處,還請見諒,希望大家批評指教,提出更好的建議。謝謝
本文出自 “林肯” 博客,請務必保留此出處http://president.blog.51cto.com/4990508/875090