#!/bin/awk-f#function:nagios插件,针对每个网卡单独设定监控阀值,脚本传递参数阀值时单位为Mbps。#example:#NAT服务器(WAN:em1,LAN:em2)带宽:下行100Mbps上行约33.3Mbps(假设上行为下行的三分之一),报警阀值按90%计算,nagios每分钟监控一次,如下:#接收(上行):100/3*0.9约等于30Mbps#发送(下行):100*0.9*等于90Mbps#监控所有网卡,nrpe配置如下:#command[check_netcount]=/usr/local/nagios/libexec/check_netcount.awkem13090em29030#注:如果是普通单台机器,只指定一个网卡监控即可:网卡名接收阀值发送阀值##Date:20150129byyangjyBEGIN{#存放上一次数据的临时文件last_f="/var/tmp/nagios_net.tmp"run_f="/proc/net/dev"#获取当前所有网卡:设备名、接收数据、发送数据while(getlinerunline<run_f){if(runline~/:/){sub(/^+/,"",runline)split(runline,runarraytmp,":+|:|+")rundata_r[runarraytmp[1]]=runarraytmp[2]rundata_t[runarraytmp[1]]=runarraytmp[10]}}#判断有没有临时文件if(system("[-f"last_f"]")==0){#获取上一次的接收、发送数据到数组while(getlinelastline<last_f){split(lastline,lastarraytmp,"")lastdata_r[lastarraytmp[1]]=lastarraytmp[2]lastdata_t[lastarraytmp[1]]=lastarraytmp[3]}#在上一步获取旧数据后,用新数据更新临时文件printf("")>last_ffor(iinrundata_r){printi,rundata_r[i],rundata_t[i]>>last_f}}#未找到临时文件,使用本次获取的各网卡接收和发送数据初始化临时文件(一般在第一次运行时执行)else{if(system("touch"last_f)==0){for(jinrundata_r){printj,rundata_r[j],rundata_t[j]>>last_flastdata_r[j]=rundata_r[j]lastdata_t[j]=rundata_t[j]}}else{print"CRITICAL-catnotcreatefile:",last_f"."exit2}}#获取各网卡及其报警阀值for(k=1;k<ARGC;k+=3){monitor_r[ARGV[--k]]=ARGV[++k]monitor_t[ARGV[k-=2]]=ARGV[k+=2]}#根据新数据和旧数据,计算这一检查周期内所有网卡产生的数据量for(linrundata_r){generate_r[l]=int((rundata_r[l]-lastdata_r[l])/1024/1024/60*8)generate_t[l]=int((rundata_t[l]-lastdata_t[l])/1024/1024/60*8)}#计算指定监控的网卡是否达到报警阀值,分别更新状态数组for(minmonitor_r){if(mingenerate_r){if(generate_r[m]>=monitor_r[m]){critical_r[m]}if(generate_t[m]>=monitor_t[m]){critical_t[m]}#原则,只对监控的网卡产生信息和性能数据绘图status=status"__"m"("monitor_r[m]","monitor_t[m]"):R="generate_r[m]"Mbps,T="generate_t[m]"Mbps"sub(/^__/,"",status)performance=performance""m"_r="generate_r[m]";"monitor_r[m]";"m"_t="generate_t[m]";"monitor_t[m]";"}else{print"CRITICAL-wrongdevname."exit2}}#如果状态数组都为0,则正常if(length(critical_r)==0&&length(critical_t)==0){print"OK-"status"|"performanceexit0}else{#快速确认哪个网卡哪个方向传输报警,收集状态数组信息for(nincritical_r){problem_r=problem_r""nsub(/^/,"",problem_r)}for(oincritical_t){problem_t=problem_t""osub(/^/,"",problem_t)}print"CRITICAL-Problem(R:"problem_r",T:"problem_t")-"status"|"performanceexit2}}