流量监控脚本

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了流量监控脚本相关的知识,希望对你有一定的参考价值。

#!/bin/bash
#set -x

========================================================================================

INTERFACE Traffic Statistics plugin for Nagios

#

Written by : majun

Release : 1.0

Creation date : 2012-4-4

Usage : ./check_iftra.sh [-w <in:warn,out:warn>] [-c <in:crit,out:crit>]

[-i <DEV>]

----------------------------------------------------------------------------------------

========================================================================================

#

HISTORY :

Release | Date | Authors | Description

--------------+-----------------+---------------+------------------------------------------

1.0 | 04.04.12 | majun |INTERFACE Traffic Statistics

--------------+-----------------+---------------+------------------------------------------

1.1 | 04.17.12 | majun |Add Ignore up rate ,Ignore the notice when traffic is too small.

--------------+-----------------+---------------+------------------------------------------

1.2 | 05.08.17 | majun |Add Ignore time hour ,Ignore the traffic jiffter warning where ignore time.

--------------+-----------------+---------------+------------------------------------------

Paths to commands used in this script. These may have to be modified to match your system setup.

USER=whoami

Nagios return codes

STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3

DW=K

ENABLE_IGNORE=1
IGNORE_UP_RATE=0.2

ifIn="ifHCInOctets"
ifOut="ifHCOutOctets"
Min_Interval=10
Max_Interval=1800

Functions plugin usage

print_release() {
echo "$RELEASE $AUTHOR"
}

print_usage() {
echo ""
echo "$PROGNAME $RELEASE - INTERFACE Traffic Statistics plugin for Nagios"
echo ""
echo "$0 -H host -C snmp-community -I interface [-L] -w in,out-warning-value -c in,out-critical-value -jw Jitter in,out-warning -jc Jitter in,out-critical -K/M"
echo ""
echo "Flags:"
echo " -H hostname"
echo " -C snmp-community "
echo " -I Interface Number "
echo " -w <number>K|M,<number>K|M : in && out ,For example ‘-w 50:60‘"
echo " -c <number>K|M,<number>K|M : in && out ,For example ‘-c 50:60‘"
echo " -jw Jitter in && out Change %,For example ‘-jw 50:60‘"
echo " -jc Jitter in && out Change %,For example ‘-jc 50:60‘"
echo " -h Show this page"
echo ""
echo "Examle"
echo "$0 -H 101.4.60.1 -C asjdkajskdaaqweqwxzcm -I 504 -L"
echo "$0 -H 101.4.60.1 -C asjdkajskdaaqweqwxzcm -I 504 -w 300:4000 -c 400:5000 -jw 10:10 -jc 20:20 -M"
echo "$0 -H 101.4.60.1 -C asjdkajskdaaqweqwxzcm -I 504 -w 300000:4000000 -c 40000:5000000 -jw 10:10 -jc 20:20 -K"
echo ""
}
print_help() {
print_usage
echo ""
echo "This plugin will check interface traffic for nagios"
echo ""
exit 0
}

if [ $# == 0 ]
then
print_help
fi

Parse parameters

while [ $# -gt 0 ]; do
case "$1" in
-h | --help)
print_help
exit $STATE_OK
;;
-v | --version)
print_release
exit $STATE_OK
;;
-L )
NAMELIST=TURE
;;
-H | --host)
shift
HOST=$1
;;
-C | --community)
shift
COMMUNITY=$1
;;
-I | --INTERFACE)
shift
INTERFACE=$1
;;
-w | --warning)
shift
IN_WARN=echo $1|awk -F ‘:‘ ‘{print $1}‘
OUT_WARN=echo $1|awk -F ‘:‘ ‘{print $2}‘
;;
-c | --critical)
shift
IN_CRIT=echo $1|awk -F ‘:‘ ‘{print $1}‘
OUT_CRIT=echo $1|awk -F ‘:‘ ‘{print $2}‘
;;
-jw)
shift
IN_JWARN=echo $1|awk -F ‘:‘ ‘{print $1}‘
OUT_JWARN=echo $1|awk -F ‘:‘ ‘{print $2}‘
;;
-jc)
shift
IN_JCRIT=echo $1|awk -F ‘:‘ ‘{print $1}‘
OUT_JCRIT=echo $1|awk -F ‘:‘ ‘{print $2}‘
;;
-ij)
shift
IGBG=echo $1|awk -F ‘:‘ ‘{print $1}‘
IGED=echo $1|awk -F ‘:‘ ‘{print $2}‘
;;
-M)
DW=M
;;
-K)
DW=K
;;
*) echo "Unknown argument: $1"
print_usage
exit $STATE_UNKNOWN
;;
esac
shift
done

to_debug(){
if [ "$Debug" = "true" ]; then
echo "$" #>> /tmp/check_traffic.log.$$ 2>&1
#$Echo "$
" >> /tmp/check_traffic.log 2>&1
fi
}

CF_HIST_DATA="/var/tmp/checktraffic${HOST}_${INTERFACE}.histdat${USER}"
to_debug $HOST w=$IN_WARN OUT_WARN=$OUT_WARN IN_CRIT=$IN_CRIT OUT_CRIT=$OUT_CRIT IN_JWARN=$IN_JWARN OUT_JWARN=$OUT_JWARN IN_JCRIT=$IN_JCRIT OUT_JCRIT=$OUT_JCRIT

SNMPWALK=which snmpwalk
ifName=$SNMPWALK -v 2c -c $COMMUNITY $HOST IF-MIB::ifDescr.${INTERFACE}| awk -F ":" ‘{print $4}‘
_result_status=$SNMPWALK -v 2c -c $COMMUNITY $HOST "IF-MIB::ifOperStatus.${INTERFACE}"| awk ‘{print $4}‘ | awk -F ‘(‘ ‘{print $1}‘
if [ "$NAMELIST"aa = TUREaa ]
then
$SNMPWALK -v 2c -c $COMMUNITY $HOST IF-MIB::ifDescr
#then echo Interface.$INTERFACE=$ifName
exit 0
fi

if [ ! -f $CF_HIST_DATA ]; then
IsFirst="True"
touch $CF_HIST_DATA
if [ $? -ne 0 ];then
Severity=3
Msg="Unknown"
OutPut="Create File $CF_HIST_DATA Error with user id."
$Echo "$Msg" "-" $OutPut
exit $Severity
fi

fi

_result_in=$SNMPWALK -v 2c -c $COMMUNITY $HOST "IF-MIB::${ifIn}.$INTERFACE"
_result_out=$SNMPWALK -v 2c -c $COMMUNITY $HOST "IF-MIB::${ifOut}.$INTERFACE"

if [ -z "$_result_in" -o -z "$_result_out" ] ; then
$Echo "No Data been get here. Please confirm your ARGS and re-check it with Verbose mode"
exit 3
fi
to_debug time is $Time, $SNMPWALK check result in is $_result_in, out is $_result_out
TIME=date +%s
_result_in=echo $_result_in |awk ‘{print $4}‘
_result_out=echo $_result_out|awk ‘{print $4}‘

CIN=echo "$_result_in * 1 " |bc
COUT=echo "$_result_out * 1 " |bc

to_debug Time is $Time, In is $In, Out is $Out

HISTDATA=cat $CF_HIST_DATA| head -n 1
HISTTIME=echo $HISTDATA| awk -F "|" ‘{print $1}‘|sed ‘s/ //g‘
HISTIN=echo $HISTDATA| awk -F "|" ‘{print $2}‘|sed ‘s/ //g‘
HISTOUT=echo $HISTDATA| awk -F "|" ‘{print $3}‘|sed ‘s/ //g‘
HISTPDATA=cat $CF_HIST_DATA| tail -n 1
HISTINPS=echo $HISTPDATA| awk -F "|" ‘{print $1}‘|sed ‘s/ //g‘
HISTOUTPS=echo $HISTPDATA| awk -F "|" ‘{print $2}‘|sed ‘s/ //g‘
to_debug HistTime is $HISTTIME, HistIn is $HISTIN, HistOut is $HISTOUT
DIFFIN=echo "$CIN - $HISTIN" | bc
DIFFOUT=echo "$COUT - $HISTOUT" | bc
Interval=echo "$TIME - $HISTTIME" | bc
INPS=echo "$DIFFIN / $Interval" | bc
OUTPS=echo "$DIFFOUT / $Interval" | bc

if [ -z "$HISTTIME" -o -z "$HISTIN" -o -z "$HISTOUT" ] ; then
echo "$TIME|$CIN|$COUT" > $CF_HIST_DATA
if [ "$IsFirst" = "True" ]; then
Severity="0"
Msg="OK"
OutPut="It‘s the first time for this plugins run. We‘ll get the data from the next time."
else
Severity="3"
Msg="Unknown"
OutPut="Can not found data in the history data file. \
Please to check the file $CF_HIST_DATA ,or use use verbose mode and check the debug file"
fi
echo "$Msg" "-" $OutPut
exit $Severity
fi

LINE=cat $CF_HIST_DATA|wc -l
if [ $LINE == 1 ]
then
echo "$TIME|$CIN|$COUT" > $CF_HIST_DATA
echo "$INPS|$OUTPS" >>$CF_HIST_DATA
echo OK "It‘s the Second time for this plugins run. We‘ll get the data from the next time."
exit 0
fi

if [ $INPS = 0 ]
then
INPS=1
fi
if [ $OUTPS = 0 ]
then
OUTPS=1
fi
if [ $Interval -lt $Min_Interval ] ; then
echo "The check interval must greater than $Min_Interval Seconds. But now it‘s $Interval. Please retry it later."
exit 3
fi
#if [ $Interval -gt $Max_Interval ] ; then

echo "The check interval is too large(It\‘s greate than $Max_Interval). The result is droped. We\‘ll use the fresh data at the next time."

exit 3

#fi

echo "$TIME|$CIN|$COUT" >$CF_HIST_DATA
echo "$INPS|$OUTPS" >>$CF_HIST_DATA

INPSK=echo "$INPS * 8 / 1024"|bc
OUTPSK=echo "$OUTPS * 8 / 1024" |bc

INPSM=echo "$INPSK /1024"|bc
OUTPSM=echo "$OUTPSK / 1024"|bc

if [ $DW = M ]
then
INPSRE=${INPSM}
OUTPSRE=${OUTPSM}

else

    INPSRE=${INPSK}
    OUTPSRE=${OUTPSK}

fi

    check_INW=`echo "$INPSRE < $IN_WARN" | bc`
    check_OUTW=`echo "$OUTPSRE < $OUT_WARN" | bc`
    check_INC=`echo "$INPSRE < $IN_CRIT" | bc`
    check_OUTC=`echo "$OUTPSRE < $OUT_CRIT" | bc`

    if [ $check_INW -eq 1 -a $check_OUTW -eq 1 ] ; then
            Severity="0";
            Msg="OK";
            to_debug Severity is $Severity , Msg is $Msg
    elif [ $check_INC -eq 1 -a $check_OUTC -eq 1 ] ; then
            Severity="1";
            Msg="Warning";
            to_debug Severity is $Severity , Msg is $Msg
    else
            Severity="2";
            Msg="Critical";
            to_debug Severity is $Severity , Msg is $Msg
    fi

    DiffRIAVG=`echo "$INPS - $HISTINPS"|bc`
    DiffROAVG=`echo "$OUTPS - $HISTOUTPS"|bc`

    if [ "$DiffRIAVG" -gt "0" ]
    then
            RID=Up
    else
            RID=Down
    fi
    if [ "$DiffROAVG" -gt "0" ]
    then
            ROD=Up
    else
            ROD=Down
    fi
    DiffRIAVG=`echo $DiffRIAVG | sed ‘s/-//‘`
    DiffROAVG=`echo $DiffROAVG | sed ‘s/-//‘`

    DiffRIAVG=`echo "scale=0; $DiffRIAVG * 100 / $HISTINPS  " |bc`
    DiffROAVG=`echo "scale=0; $DiffROAVG * 100 / $HISTOUTPS " |bc`

    check_INJW=`echo "$DiffRIAVG < $IN_JWARN" | bc`
    check_OUTJW=`echo "$DiffROAVG < $OUT_JWARN" | bc`
    check_INJC=`echo "$DiffRIAVG < $IN_JCRIT" | bc`
    check_OUTJC=`echo "$DiffROAVG < $OUT_JCRIT" | bc`

    IGN_IN=`echo "$IN_CRIT * $IGNORE_UP_RATE < $INPSRE"|bc`
    IGN_OUT=`echo "$OUT_CRIT * $IGNORE_UP_RATE < $OUTPSRE"|bc`
    if [ "$ENABLE_IGNORE" == "1" ]
    then
            if [ $RID == Up -a $IGN_IN == 0 ] 
            then
                    check_INJW=1
                    check_INJC=1
            fi

            if [ $ROD == Up -a $IGN_OUT == 0 ]
            then
                    check_OUTJW=1
                    check_OUTJC=1
            fi
    fi

    if [ $check_INJW -eq 1 -a $check_OUTJW -eq 1 ] ; then
            JSeverity="0";
            JMsg="OK";
            to_debug Severity is $Severity , Msg is $Msg
    elif [ $check_INJC -eq 1 -a $check_OUTJC -eq 1 ] ; then
            JSeverity="1";
            JMsg="Warning";
            to_debug Severity is $Severity , Msg is $Msg
    else
            JSeverity="2";
            JMsg="Critical";
            to_debug Severity is $Severity , Msg is $Msg
    fi

if [ "$IGBG" != "0" ] && [ ! -z "$IGED" ]
then
NHOUR=date +%H
if [ $IGED -ge $IGBG ]
then
if [ "$NHOUR" -le "$IGED" ] && [ "$NHOUR" -ge "$IGBG" ]
then
JSeverity="0"
fi
else
if [ "$NHOUR" -ge "$IGBG" ] || [ "$NHOUR" -le "$IGED" ]
then
JSeverity="0"
fi
fi
fi

if [ "$JSeverity" -eq "2" -o "$Severity" -eq "2" ]
then
echo "Critical" "-" $ifName Traffic In BW="$INPSRE""${DW}bps Jitter is $RID "$DiffRIAVG""%", Out BW="$OUTPSRE""${DW}bps Jitter is $ROD "$DiffROAVG""%". The Check Interval is "$Interval"s |In\=${INPSRE}${DW} Out\=${OUTPSRE}${DW} JIn\=${DiffRIAVG}% JOut\=${DiffROAVG}%
exit 2
elif [ "$JSeverity" = 1 -o "$Severity" = "1" ]
then
echo "Warning" "-" $ifName Traffic In BW="$INPSRE""${DW}bps Jitter is $RID "$DiffRIAVG""%", Out BW="$OUTPSRE""${DW}bps Jitter is $ROD "$DiffROAVG""%". The Check Interval is "$Interval" s |In\=${INPSRE}${DW} Out\=${OUTPSRE}${DW} JIn\=${DiffRIAVG}% JOut\=${DiffROAVG}%
exit 1
else

            echo "OK" "-" $ifName Traffic In BW="$INPSRE""${DW}bps  Jitter is $RID "$DiffRIAVG""%", Out BW="$OUTPSRE""${DW}bps Jitter is $ROD "$DiffROAVG""%". The Check Interval is "$Interval"s \|In\=${INPSRE}${DW} Out\=${OUTPSRE}${DW} JIn\=${DiffRIAVG}% JOut\=${DiffROAVG}%
            exit 0

fi

以上是关于流量监控脚本的主要内容,如果未能解决你的问题,请参考以下文章

流量监控脚本

网卡流量监控脚本 ( Python )

网卡流量监控脚本 ( Shell )

基于dstat监控网卡流量,服务器状态简单脚本

LINUX下网卡流量持续监控查看shell脚本实践

求一个linux将监控网卡出入流量的shell脚本,每隔设定的时间输出到文本或其他地方存储