################################################################################ # # Module: check_dbs_free_percent.sh # # Description: Check Informix free disk space info (percent free) # Note: this program used uf_onstatd.sh as a model for collecting # the Informix info (uses the sysmaster database) # # Author: Peter R. Schmidt # # Argument 1 = Warning Limit - IN PERCENT (a number between 1 and 100) # Argument 2 = Emergency Limit - IN PERCENT (a number between 1 and 100) # Argument 3 = Which dbspace to check (if not provided - check all dbspaces) # # IMPORTANT - The limits that you specify are the minimum PERCENT FREE. For example, # check_dbs_free_percent 25 10 # means: warn me FREE SPACE falls BELOW 25% and # declare an emergency if FREE SPACE falls BELOW 10% # # Note: currently is using a 2K pagesize # # Change Log # # Date Person Description # # 12/21/1999 Peter Schmidt Start program # 01/10/2000 Peter Schmidt Specify a particular dbspace # 10/18/2000 Peter Schmidt Clarify format of run-time arguments # ################################################################################ EXCLUDE_LIST="logical|physical" # exclude these dbspaces PAGESIZE=2 # 2K Pagesize ################################################################################ if [ $# != 2 -a $# != 3 ] then echo "Usage: check_dbs_free_percent.sh [WARNING LIMIT in PERCENT] [EMERGENCY LIMIT in PERCENT] [dbspace]" echo "Note: send message if FREE SPACE falls BELOW the percentage limit specified." echo "Note: argument 3 [dbspace] is optional." exit 1 fi WARNING_LIMIT=$1 EMERGENCY_LIMIT=$2 if [ $# = 3 ] then SELECT_DBSPACE=$3 else SELECT_DBSPACE="*" fi ################################################################################ CODE_NAME=check_dbs_free_percent if [ "x$INFORMIXDIR" = "x" ] then . db.env # Set the informix environment fi TMPFILE1=${CODE_NAME}_1.tmp TMPFILE2=${CODE_NAME}_2.tmp TMPFILE3=${CODE_NAME}_3.tmp rm -f $TMPFILE1 $TMPFILE2 $TMPFILE3 ############################################################################### UNIT=K; UNITDESC=Kbytes PERCENT_TYPE=Free ############################################################################### dbaccess <<-EOF >/dev/null 2>&1 database sysmaster; unload to '$TMPFILE3' delimiter "|" select syschktab.dbsnum, syschktab.chknum, syschktab.chksize, syschktab.nfree, (chksize - nfree) nused, syschktab.flags, syschktab.fname, sysdbstab.name from syschktab, sysdbstab where syschktab.dbsnum = sysdbstab.dbsnum and sysdbstab.name matches "$SELECT_DBSPACE" and sysdbstab.name <> "sysmaster" order by 1,2 EOF #---------------------------------------------------------------------- awk ' \ BEGIN { pre_dbs_num=0 pre_dbs_name="" chunk_cnt=0 FS="|" } { dbs_num = $1 chunk_num = $2 chunk_size_P = $3 chunk_free_P = $4 chunk_used_P = $5 chunk_flags = $6 chunk_name = $7 dbs_name = $8 #------------ BEFORE GROUP ----------------------------------------- if (dbs_num != pre_dbs_num) { #-------- PRINT DBSPACE SUBTOTALS IF MULTIPLE CHUNKS ------- if (pre_dbs_num != 0) { dbs_percent=0 if (dbs_size_P > 0) { dbs_percent_used = ((dbs_used_P/dbs_size_P)*100) dbs_percent_free = ((dbs_free_P/dbs_size_P)*100) if (percent_type == "Used") { dbs_percent = dbs_percent_used } else { dbs_percent = dbs_percent_free } } if (unit == "B") { printf "%s %10d %10d %10d %5.1f %d\n", pre_dbs_name, dbs_size_B, dbs_used_B, dbs_free_B, dbs_percent, chunk_cnt } if (unit == "P") { printf "%s %10d %10d %10d %5.1f %d\n", pre_dbs_name, dbs_size_P, dbs_used_P, dbs_free_P, dbs_percent, chunk_cnt } if (unit == "K") { printf "%s %10d %10d %10d %5.1f %d\n", pre_dbs_name, dbs_size_K, dbs_used_K, dbs_free_K, dbs_percent, chunk_cnt } if (unit == "M") { printf "%s %10.1f %10.1f %10.1f %5.1f %d\n", pre_dbs_name, dbs_size_M, dbs_used_M, dbs_free_M, dbs_percent, chunk_cnt } } chunk_cnt = 0 dbs_size_P = 0 dbs_size_K = 0 dbs_size_M = 0 dbs_size_B = 0 dbs_free_P = 0 dbs_free_K = 0 dbs_free_M = 0 dbs_free_B = 0 dbs_used_P = 0 dbs_used_K = 0 dbs_used_M = 0 dbs_used_B = 0 } #------------ ON EVERY ROW ------------------------------------- chunk_size_K = chunk_size_P*pagesize chunk_size_M = chunk_size_K/1024 chunk_size_B = chunk_size_K*1024 chunk_free_K = chunk_free_P*pagesize chunk_free_M = chunk_free_K/1024 chunk_free_B = chunk_free_K*1024 chunk_used_K = chunk_used_P*pagesize chunk_used_M = chunk_used_K/1024 chunk_used_B = chunk_used_K*1024 chunk_percent=0 if (chunk_size_P > 0) { chunk_percent_used = ((chunk_used_P/chunk_size_P)*100) chunk_percent_free = ((chunk_free_P/chunk_size_P)*100) } if (percent_type == "Used") { chunk_percent = chunk_percent_used } else { chunk_percent = chunk_percent_free } dbs_size_P += chunk_size_P dbs_size_K += chunk_size_K dbs_size_M += chunk_size_M dbs_size_B += chunk_size_B dbs_free_P += chunk_free_P dbs_free_K += chunk_free_K dbs_free_M += chunk_free_M dbs_free_B += chunk_free_B dbs_used_P += chunk_used_P dbs_used_K += chunk_used_K dbs_used_M += chunk_used_M dbs_used_B += chunk_used_B tot_size_P += chunk_size_P tot_size_K += chunk_size_K tot_size_M += chunk_size_M tot_size_B += chunk_size_B tot_free_P += chunk_free_P tot_free_K += chunk_free_K tot_free_M += chunk_free_M tot_free_B += chunk_free_B tot_used_P += chunk_used_P tot_used_K += chunk_used_K tot_used_M += chunk_used_M tot_used_B += chunk_used_B pre_dbs_num = dbs_num pre_dbs_name = dbs_name chunk_cnt++ } END { #-------- PRINT DBSPACE SUBTOTALS IF MULTIPLE CHUNKS ------- if (pre_dbs_num != 0) { dbs_percent=0 if (dbs_size_P > 0) { dbs_percent_used = ((dbs_used_P/dbs_size_P)*100) dbs_percent_free = ((dbs_free_P/dbs_size_P)*100) } if (percent_type == "Used") { dbs_percent = dbs_percent_used } else { dbs_percent = dbs_percent_free } if (unit == "B") { printf "%s %10d %10d %10d %5.1f %d\n", pre_dbs_name, dbs_size_B, dbs_used_B, dbs_free_B, dbs_percent, chunk_cnt } if (unit == "P") { printf "%s %10d %10d %10d %5.1f %d\n", pre_dbs_name, dbs_size_P, dbs_used_P, dbs_free_P, dbs_percent, chunk_cnt } if (unit == "K") { printf "%s %10d %10d %10d %5.1f %d\n", pre_dbs_name, dbs_size_K, dbs_used_K, dbs_free_K, dbs_percent, chunk_cnt } if (unit == "M") { printf "%s %10.1f %10.1f %10.1f %5.1f %d\n", pre_dbs_name, dbs_size_M, dbs_used_M, dbs_free_M, dbs_percent, chunk_cnt } } #-------- PRINT FINAL TOTALS ------------------------------------ } ' unit=$UNIT unitdesc=$UNITDESC percent_type=$PERCENT_TYPE pagesize=$PAGESIZE $TMPFILE3 | egrep -v "$EXCLUDE_LIST" > $TMPFILE1 #------------------------------------------------------------------------------- while read DBSPACE ALLOCATED USED NEW_FREE NEW_PERCENT_FREE NUM_CHUNKS do if [ $NEW_PERCENT_FREE -lt $EMERGENCY_LIMIT ] then echo "******* EMERGENCY ******* (${DBSPACE})" echo "Free space on dbspace ${DBSPACE} has dropped below the emergency limit of ${EMERGENCY_LIMIT} %" echo "Available free space is down to ${NEW_FREE} ${UNITDESC} (${NEW_PERCENT_FREE} %)" echo else if [ $NEW_PERCENT_FREE -lt $WARNING_LIMIT ] then echo "******* WARNING ******* (${DBSPACE})" echo "Free space on dbspace ${DBSPACE} has dropped below the warning limit of ${WARNING_LIMIT} %" echo "Available free space is down to ${NEW_FREE} ${UNITDESC} (${NEW_PERCENT_FREE} %)" echo fi fi done < $TMPFILE1 rm -f $TMPFILE1 $TMPFILE2 $TMPFILE3