nagios插件-监控tcp状态连接数shell脚本
这是用shell开发的nagios插件,根据Nagios Plugin Development Guidelines和Nagios Plugin API编写,在前人的基础上进行补充,支持官方标准的-V、-c -v -t选项。插件主要思路是通过netstat命令获取tcp的各个状态连接,统计每个状态数量,最后按照标准的nagios插件格式输出检测信息和性能信息。监控那种状态,连接数多少警报,都可以通过脚本参数指定。
nagios监控服务器,通过nrpe在被监控端执行检测脚本,并把检测脚本运行的状态返回值和输出信息,返回给nagios监控服务器。其中状态返回值0代表正常,1代表警告,2代表紧急,3代表未知。
说明:脚本支持这几个参数
-V|–version 显示脚本版本信息
-c|--critical threshold 指定critical的阀值,必须指定
-w|–warning threshold 指定warning的阀值,必须指定
-s|–status tcp status 指定tcp连接状态,必须指定
-h|–help 获取使用帮助
-t|–timeout time 指定脚本运行超时时间
threshold格式
~代表负无穷大
从0开始可以省略start:即0:end
前面有start: 没有指明结束值,则为无穷大
报警会在超出起始值与结束值之间,包括这两个值
起始值为@,则报警会在起始值与结束值之间,包括这两个值
10 小于0和大于10则警报
10: 在10到正无穷大之外,即负无穷大到10警报
~:10 在负无穷大到10之外,即10到正无穷大警报
10:20 10到20之外,即小于10和大于20
@10:20 在10到20之间警报
@10 在0到10之间警报
这个脚本可能还有bug,欢迎大家修复。
#!/bin/bashSTATE_OK=0STATE_WARNING=1STATE_CRITICAL=2STATE_UNKNOWN=3STATE_DEPENDENT=4PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbinprint_revision(){echo"(nagios-plugins-netstat0.5)"}usage(){echo-e"Usage:$0[-V|--version][-h|--help]<-w|--warningwarningthreshold>\n<-c|--criticalcriticalthreshold><-s|--statusstatus>\n<-t|--timeouttime>"}check_range(){mflag=0ifecho$1|grep-E-q"^@?((~:[0-9]*$)|([0-9]+:?[0-9]*$))";thenifecho$1|grep-E-q"^@";thenrange=${1#@}mflag=1elserange=$1fiifecho$range|grep-E-q":";thenstart=${range%%:*}if["$start"="~"];thenstart=-999999fiif["$start"-lt0];thenreturn2fiend=${range#*:}if[[-z$end]];thenend=65535fielsestart=0end=$rangefiif["$start"!="~"]&&["$end"!=""];thenif[$start-gt$end];thenreturn2fifielseecho"invalidrange"return2fireturn0}select_arg(){if[$#-eq0];thenreturn1fiwcount=0ccount=0scount=0until[$#-eq0];docase$1in-V|--version)versionflag=1shift1;;-h|--help)helpflag=1shift1;;-w|--warning)[$#-lt2]&&return1check_range$2if[$?-ne0];thenreturn1elsewarn_start=$startwarn_end=$endwarn_mflag=$mflagfishift2letwcount++;;-c|--critical)[$#-lt2]&&return1check_range$2if[$?-ne0];thenreturn1elsecritical_start=$startcritical_end=$endcritical_mflag=$mflagfishift2letccount++;;-s|--status)[$#-lt2]&&return1case$2inestablished|ESTABLISHED)status=established;;time_wait|TIME_WAIT)status=time_wait;;syn_recv|SYN_RECV)status=syn_recv;;fin_wait1|FIN_WAIT1)status=fin_wait1;;fin_wait1|FIN_WAIT2)status=fin_wait2;;last_ack|LAST_ACK)status=last_ack;;close_wait|CLOSE_WAIT)status=close_wait;;*)return1;;esacshift2letscount++;;-t|--timeout)[$#-lt2]&&return1if!echo$2|grep-E-q"^[1-9][0-9]*$";thenreturn1fitimeout=$2;;*)return1;;esacdonereturn0}alarm(){connect=`netstat-ant|awk'/^tcp/&&!/LISTEN/{S[$NF]++}END{for(iinS)printi,S[i]}'`established=`echo$connect|awk'/ESTABLISHED/{print$2}'`[-z$established]&&established=0time_wait=`echo$connect|awk'/TIME_WAIT/{print$2}'`[-z$time_wait]&&time_wait=0syn_recv=`echo$connect|awk'/SYN_RECV/{print$2}'`[-z$syn_recv]&&syn_recv=0fin_wait1=`echo$connect|awk'/FIN_WAIT1/{print$2}'`[-z$fin_wait1]&&fin_wait1=0fin_wait2=`echo$connect|awk'/FIN_WAIT2/{print$2}'`[-z$fin_wait2]&&fin_wait2=0last_ack=`echo$connect|awk'/LAST_ACK/{print$2}'`[-z$last_ack]&&last_ack=0close_wait=`echo$connect|awk'/CLOSE_WAIT/{print$2}'`[-z$close_wait]&&close_wait=0if[$warn_mflag-eq0-a$critical_mflag-eq0];thenw1=-ge;w2=-le;c1=-ge;c2=-le;wboole=-a;cboole=-aelif[$warn_mflag-eq1-a$critical_mflag-eq0];thenw1=-le;w2=-ge;c1=-ge;c2=-le;wboole=-o;cboole=-aelif[$warn_mflag-eq0-a$critical_mflag-eq1];thenw1=-ge;w2=-le;c1=-le;c2=-ge;wboole=-a;cboole=-oelif[$warn_mflag-eq1-a$critical_mflag-eq1];thenw1=-le;w2=-ge;c1=-le;c2=-ge;wboole=-o;cboole=-ofiif[${!status}$w1$warn_start$wboole${!status}$w2$warn_end]&&[${!status}$c1$critical_start$cboole${!status}$c2$critical_end];thenexitcode=0elseif![${!status}$w1$warn_start$wboole${!status}$w2$warn_end];thenexitcode=1fiif![${!status}$c1$critical_start$cboole${!status}$c2$critical_end];thenexitcode=2fiif[${!status}-le0];thenexitcode=3fifiif[$exitcode-eq0];thenserviceoutput="$statusOK-total:${!status}"elif[$exitcode-eq1];thenserviceoutput="$statusWarning-total:${!status}"elif[$exitcode-eq2];thenserviceoutput="$statusCritical-total:${!status}"elif[$exitcode-eq3];thenserviceoutput="$statusUnknown-total:${!status}"fiecho-e"$serviceoutput;|established$established;\ntime_wait$time_wait;\nsyn_recv$syn_recv;\nfin_wait1$fin_wait1;\nfin_wait2$fin_wait2;\nlast_ack$last_ack;\nclose_wait$close_wait"exit$exitcode}select_arg$@[$?-ne0]&&usage&&exit3if[[-n$versionflag]];thenif[$versionflag-eq1];thenprint_revision&&exit0fielse[[-n$helpflag]]&&[$helpflag-eq1]&&usage&&exit0fi[$ccount-ne1]||[$wcount-ne1]||[$scount-ne1]&&usage&&exit3[-z$timeout]&&timeout=10alarm&commandpid=$!(sleep$timeout;commandchild=$(ps-eopid,ppid|awk"\$2==$commandpid{print\$1}");forbin$commandchild;dokill-9$b&>/dev/null;done;kill-9$commandpid&>/dev/null)&watchdog=$!wait$commandpid&>/dev/nullpexitcode=$?[$pexitcode-gt3]&&pexitcode=3watchdogchild=`ps-eopid,ppid|awk"\\$2==$watchdog{print\\$1}"`forain$watchdogchild;dokill-9$a&>/dev/nulldonekill-9$watchdog&>/dev/nullexit$pexitcode
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。