使用shell脚本进行服务器系统监控——文件系统监控(5)

    技术2022-05-11  66

    #!/usr/bin/ksh

    WORKFILE="/tmp/df.work" # Holds filesystem data>$WORKFILE              # Initialize to emptyOUTFILE="/tmp/df.outfile" # Output display file>$OUTFILE  # Initialize to emptyEXCEPTIONS="/usr/local/bin/exceptions" # Override data fileDATA_EXCEPTIONS="/tmp/dfdata.out" # Exceptions file w/o # rowsEXCEPT_FILE="N"        # Assume no $EXCEPTIONS FILETHISHOST=`hostname`    # Hostname of this machine

    MIN_MB_FREE="100MB"    # Min. MB of Free FS SpaceMAX_PERCENT="85%"      # Max. FS percentage valueFSTRIGGER="1000MB"     # Trigger to switch from % Used to MB Free

    # Both of these variables need to multiplied by 1024 blocks(( MIN_MB_FREE = $(echo $MIN_MB_FREE | sed s/MB//g) * 1024 ))(( FSTRIGGER = $(echo $FSTRIGGER | sed s/MB//g)  * 1024 ))

    function get_OS_info{typeset -u OS   OS=`uname`   print $OS   }

    function check_exceptions{

    while read FSNAME FSLIMITdo    IN_FILE="N"

        echo $FSNAME | grep ':' >/dev/null /         && FSNAME=$(echo $FSNAME | cut -d ':' -f2)

        if [[ ! -z "$FSLIMIT" && "$FSLIMIT" != '' ]]    then        if [[ $FSNAME = $FSMOUNT ]] # Found it!        then            # Check for "MB" Characters...Set IN_FILE=MB     echo $FSLIMIT | grep MB >/dev/null && IN_FILE="MB" /                 && (( FSLIMIT = $(echo $FSLIMIT /                       | sed s/MB//g) * 1024 )) >/dev/null 2>&1            # check for "%" Character...Set IN_FILE=PC, for %            echo $FSLIMIT | grep "%" >/dev/null && IN_FILE="PC" /                 && FSLIMIT=$(echo $FSLIMIT | sed s//%//g) /                 >/dev/null 2>&1            case $IN_FILE in            MB)                # Up-case the characters, if they exist                FSLIMIT=$(echo $FSLIMIT | tr '[a-z]' '[A-Z]')                # Get rid of the "MB" if it exists                FSLIMIT=$(echo $FSLIMIT | sed s/MB//g)                # Test for blank and null values                if [[ ! -z $FSLIMIT && $FSLIMIT != '' ]]                then                   # Test for a valid filesystem "MB" limit                   if (( $FSLIMIT >= 0 && $FSLIMIT < $FSSIZE ))                   then                      if (( $FSMB_FREE < $FSLIMIT ))                      then                         return 1 # Found out of limit using MB Free method                      else                         return 3 # Found OK                      fi                   else                       (( FSLIMIT = $FSLIMIT / 1024 )) # To get a good display value                       (( FSSIZE = $FSSIZE / 1024 ))   # To get a good dispaly value                       echo "/nERROR: Invalid filesystem MINIMUM MB FREE specified"                       echo "for $FSMOUNT - ${FSLIMIT}MB -- Current size is ${FSSIZE}MB."                       echo "Exceptions file value must be less than or equal to the"                       echo "size of the filesystem measured Megabytes/n"                   fi                else                   echo "/nERROR: Null value specified in excepeptions file"                   echo "       for the $FSMOUNT mount point./n"                fi                ;;            PC)                # Strip out the % sign if it exists                PC_USED=$(echo $PC_USED | sed s//%//g)                # Test for blank and null values                if [[ ! -z $FSLIMIT && $FSLIMIT != '' ]]                then                   # Test for a valid percentage, i.e. 0-100                   if (( $FSLIMIT >= 0 && $FSLIMIT <= 100 ))                   then                      if (( $PC_USED > $FSLIMIT ))                      then                         return 2 # Found exceeded by % Used method                      else                         return 3 # Found OK                      fi                   else                      echo "/nERROR: Invalid percentage for $FSMOUNT - $FSLIMIT"                      echo "       Exceptions file values must be"                      echo "       between 0 and 100%/n"                   fi                else                   echo "/nERROR: Null value specified in excepeptions file"                   echo "       for the $FSMOUNT mount point./n"                fi                ;;            N)                # Method Not Specified - Use Script Defaults                if (( $FSSIZE >= $FSTRIGGER ))                then # This is a "large" filesystem                    if (( $FSMB_FREE < $MIN_MB_FREE ))                    then                         return 1 # Found out of limit using MB Free method                    else                         return 3 # Found OK                    fi                 else # This is a standard filesystem                    PC_USED=$(echo $PC_USED | sed s//%//g) # Remove the %                    FSLIMIT=$(echo $FSLIMIT | sed s//%//g) # Remove the %                    if (( $PC_USED > $FSLIMIT ))                    then                        return 2 # Found exceeded by % Used method                    else                        return 3 # Found OK                    fi                fi                ;;            esac        fi    fidone < $DATA_EXCEPTIONS # Feed the loop from the bottom!!!

    return 4 # Not found in $EXCEPTIONS file}

    ####################################

    function display_output{if [[ -s $OUTFILE ]]then      echo "/nFull Filesystem(s) on $THISHOST/n"      cat $OUTFILE      printfi}

    ####################################

    function load_EXCEPTIONS_data{# Ingore any line that begins with a pound sign, ## and omit all blank lines

    cat $EXCEPTIONS |  grep -v "^#" | sed /^$/d > $DATA_EXCEPTIONS}

    ####################################

    function load_AIX_FS_data{

       df -k | tail +2 | egrep -v '/dev/cd[0-9]|/proc' /         | awk '{print $1, $2, $3, $4, $7}' > $WORKFILE}

    ####################################

    function load_HP_UX_FS_data{

       bdf | tail +2 | egrep -v '/cdrom' /         | awk '{print $1, $2, $4, $5, $6}' > $WORKFILE}

    ####################################

    function load_LINUX_FS_data{

       df -k | tail +2 | egrep -v '/cdrom'/         | awk '{print $1, $2, $4, $5, $6}' > $WORKFILE}

    ####################################

    function load_Solaris_FS_data{

       df -k | tail +2 | egrep -v '/dev/fd|/etc/mnttab|/proc'/         | awk '{print $1, $2, $4, $5, $6}' > $WORKFILE}

    ############################################# START OF MAIN ################################################

    # THIS_OS=`get_OS_info` # Execute the function

    # case $THIS_OS incase $(get_OS_info) in   AIX)   # Load filesystem data for AIX          load_AIX_FS_data      ;;   HP-UX) # Load filesystem data for HP-UX          load_HP_UX_FS_data      ;;   LINUX) # Load filesystem data for Linux          load_LINUX_FS_data      ;;   SUNOS) # Load filesystem data for Solaris          load_Solaris_FS_data      ;;   *)     # Unsupported in script          echo "/nUnsupported Operating System for this Script...EXITING/n"          exit 1esac

    # Do we have a non-zero size $EXCEPTIONS file?

    if [[ -s $EXCEPTIONS ]]then # Found a non-empty $EXCEPTIONS file

        load_EXCEPTIONS_data    EXCEP_FILE="Y"fi

    while read FSDEVICE FSSIZE FSMB_FREE PC_USED FSMOUNTdo     if [[ $EXCEP_FILE = "Y" ]]     then         check_exceptions         CE_RC="$?" # Check Exceptions Return Code (CE_RC)

             case $CE_RC in         1) # Found exceeded in exceptions file by MB Method            (( FS_FREE_OUT = $FSMB_FREE / 1000 ))            echo "$FSDEVICE mounted on $FSMOUNT has ${FS_FREE_OUT}MB Free" /                  >> $OUTFILE          ;;         2) # Found exceeded in exceptions file by %Used method            echo "$FSDEVICE mount on $FSMOUNT is ${PC_USED}%" /                  >> $OUTFILE          ;;         3) # Found OK in exceptions file            : # NO-OP Do Nothing          ;;

             4) # Not found in exceptions file - Use Default Triggers            if (( $FSSIZE >= $FSTRIGGER ))            then # This is a "large" filesystem               FSMB_FREE=$(echo $FSMB_FREE | sed s/MB//g) # Remove the "MB"              if (( $FSMB_FREE < $MIN_MB_FREE  ))              then                (( FS_FREE_OUT = $FSMB_FREE / 1000 ))                echo "$FSDEVICE mounted on $FSMOUNT has ${FS_FREE_OUT}MB Free" /                      >> $OUTFILE              fi            else # This is a standard filesystem                PC_USED=$(echo $PC_USED | sed s//%//g)                MAX_PERCENT=$(echo $MAX_PERCENT | sed s//%//g)                if (( $PC_USED > $MAX_PERCENT ))                then                    echo "$FSDEVICE mount on $FSMOUNT is ${PC_USED}%" /                          >> $OUTFILE                fi            fi          ;;         esac

         else # NO $EXECPTIONS FILE USE DEFAULT TRIGGER VALUES

              if (( $FSSIZE >= $FSTRIGGER  ))           then # This is a "large" filesystem - Use MB Free Method            FSMB_FREE=$(echo $FSMB_FREE | sed s/MB//g) # Remove the "MB"            if (( $FSMB_FREE < $MIN_MB_FREE ))            then              (( FS_FREE_OUT = $FSMB_FREE / 1000 ))              echo "$FSDEVICE mounted on $FSMOUNT has ${FS_FREE_OUT}MB Free" /                       >> $OUTFILE            fi          else # This is a standard filesystem - Use % Used Method              PC_USED=$(echo $PC_USED | sed s//%//g)              MAX_PERCENT=$(echo $MAX_PERCENT | sed s//%//g)              if (( $PC_USED > $MAX_PERCENT ))              then                  echo "$FSDEVICE mount on $FSMOUNT is ${PC_USED}%" /                        >> $OUTFILE              fi          fi     fidone < $WORKFILE

    display_output

    # End of Script 


    最新回复(0)