网络流量的监控工具有很多,如:Mrtg、Cacti、Zabbix等等,他们都有着各自的特点,不同的侧重,只为适合不同的应用场景的各种特殊需求。除了网络流量监控工具以外,还有Nagios这样的监控主机状态的工具,不仅能有效监控Windows、Linux和Unix的主机状态,交换机路由器等网络设置,打印机等。还能在系统或服务状态异常时发出邮件或短信报警第一时间通知网站运维人员,在状态恢复后发出正常的邮件或短信通知等功能。除此之外Nagios简单地插件设计使得用户可以方便地扩展自己服务的检测方法。也正是这一点,让Nagios几乎无所不能。我们也经常利用这个特性,使用Shell编写各类插件配合Ngios的使用。
Nagios虽然强大,但无法像Cacti那样图形化监控网络流量。因此Nagios+Cacti通过NPC整合在一起,强强联手成为了一种经常被使用的组合。关于这方面的知识,我会在后续的博客中有所描述,此处暂略过。只为图形化流量使用情况就要在学习Cacti的同时,还要将Nagios与Cacti进行整合,成本未免太高。有没有一种方式可以自定义网络流量监控并以图形化的方式显示出来呢?本文就是利用Shell配合绘图工具GnuPlot将网络流量图形化的展示出来,大家可以将他嵌入到Nagios或者干脆单独使用。
首先我们需要获得网络流量。运行ifconfig命令

eth0Linkencap:EthernetHWaddr00:0C:29:58:A5:D5
inetaddr:192.168.0.15Bcast:192.168.0.255Mask:255.255.255.0
inet6addr:fe80::20c:29ff:fe58:a5d5/64Scope:Link
UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1
RXpackets:7errors:0dropped:0overruns:0frame:0
TXpackets:16errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:1000
RXbytes:496(496.0b)TXbytes:2452(2.3KiB)
Interrupt:193Baseaddress:0x2000

其中RXBytes、TXBytes:为总传送、接收的字节总量(红色标注部分)。我们将其取出并相加。命令如下:

ifconfig|awk-F":"'NR==8{print$2+$3}'(本例获得结果为2948,单位为byte)

我们将以分钟为单位取得该值并与之前取得值的总和相减得到每分钟的网卡流量并导入到文本文件中。文件的格式如下:

06:01:002948
06:02:001948
06:03:002948
06:04:003948
06:05:001948
06:06:003948
........

echo-n`date+%H:%M:%S`"">>result;echo$[`ifconfig|awk-F":"'NR==8{print$2+$3}'`-`awk'{sum+=$2}END{printsum}'result`]>>result

echo-n`date+%H:%M:%S`"">>1;#以小时:分钟:秒为格式获取当前系统时间并输出重定向到result文件中,-n选项为不输出换行符。
awk'{sum+=$2}END{printsum}'result#为获得result文件中第二列所有值的和
echo$[`ifconfig|awk-F":"'NR==8{print$2+$3}'`-`awk'{sum+=$2}END{printsum}'result`]>>result#将当前网卡流量减去之前统计的网

卡流量总和得到这一分钟内网卡的流量并将其输出重定向到result文件中。

#!/bin/bash
whiletrue;do
echo-n`date+%H:%M:%S`"">>result;echo$[`ifconfig|awk-F":"'NR==8{print$2+$3}'`-`awk'{sum+=$2}END{printsum}'result`]>>result
sleep60
done

reslut文件内容如下:
06:31:012948
06:32:011948
06:33:012948
06:34:013948
06:35:011948
06:36:013948
06:37:012680
06:38:013127
06:39:014162
06:40:015137
06:41:011348
06:42:011872
06:43:012882
06:44:011972
06:45:015689
06:46:011952
06:47:012371
06:48:013333
06:49:014523
06:50:011346
06:51:017864
06:52:013256
06:53:015742
06:54:011234
06:55:014328
06:56:012651
06:57:011463
06:58:012813
06:59:011111
07:00:012134
07:01:011687
07:02:013383
07:03:012345

现在我们就可以通过GnuPlot进行绘图。
setterminalpngsmallcolorpicsize600400#以png格式,坐标字体为小字体,大小为600*400输出绘图
setoutput"eth0.png"#输出图片的名称为eth0.png
setxdatatime#设定X坐标的类型为时间类型
settimefmt"%H:%M:%S"#设定时间类型的格式
setgrid#设定网格为输出图片背景
setstyledatalinespoints#设定绘图使用点线方式
setxticrotateby90#将X坐标以90旋转
plot"result"using1:2title"eth0"pointtype3linetype2#以result文件的一列为X坐标绘制第二列的内容,图片右上角标示为eth0

将以上内容保存为文件eth0
cateth0|gnuplot#执行绘图
本例输出的图片如下:
223258568.png

完整shell脚本如下:

#!/bin/bash
whiletrue;do
echo-n`date+%H:%M:%S`"">>result;echo$[`ifconfig|awk-F":"'NR==8{print$2+$3}'`-`awk'{sum+=$2}END{printsum}'result`]>>result
cateth0|gnuplot#由于每次生成的图片会覆盖原来的图片,所以不用进行删除操作
sleep60
done