Skip to content
Snippets Groups Projects
check_proc_mem 3.52 KiB
#!/bin/bash
# ======================================================================
#
# NAGIOS CLIENT CHECK :: SHOW PROCESSES USING A LOT OF MEMORY
#
# ----------------------------------------------------------------------
#
# SYNTAX:
#  ./check_proc_mem [-w WARNLIMIT] [-c CRITICALLIMIT]
#  WARNLIMIT, CRITICALLIMIT are integer values in MB
#
# ----------------------------------------------------------------------
# 2020-03-02  v1.0  initial version
# 2020-03-05  v1.1  <axel.hahn@iml.unibe.ch>  switch to ph.* helper functions
# 2023-02-13  v1.2  <axel.hahn@unibe.ch>      some shell fixes
# 2023-12-22  v1.3  <axel.hahn@unibe.ch>      add help; do not use tmp file anymore; 5..10 times faster
# ======================================================================

. $( dirname $0 )/inc_pluginfunctions

export self_APPVERSION=1.3

typeset -i iSizeMB

# --- limits
typeset -i iWarnLimit=100
typeset -i iCriticalLimit=500

typeset -i iCountWarning=0
typeset -i iCountCritical=0

# ----------------------------------------------------------------------
# functions
# ----------------------------------------------------------------------

# show help text
function showHelp(){
    local _self; _self=$(basename $0)
cat <<EOF
$( ph.showImlHelpHeader )

Show processes that consume the most memory.
You get a list with processes consuming 

  * more than the critical limit
  * between warning and critical limit

SYNTAX:

  $_self [-h] [-c VALUE] [-w VALUE]

OPTIONS:

  -h, --help 
      this help

PARAMETERS:

  -c, --critical VALUE
      critical level in MB (default: $iCriticalLimit)

  -w. --warning VALUE
      warning level in MB (default: $iWarnLimit)

EXAMPLE:

  $_self
      Check processes with initial memory values

  $_self -w 1000 -c 2000
      Check processes consuming more than 1000 MB and mark those as critical
      that use more than 2000 MB.

EOF
}


# ----------------------------------------------------------------------
# MAIN
# ----------------------------------------------------------------------


# --- check param -h

while [[ "$#" -gt 0 ]]; do case $1 in
    -h|--help)      showHelp; exit 0;;
    -c|--critcal)   iCriticalLimit=$2; shift ;shift;;
    -w|--warning)   iWarnLimit=$2; shift ;shift;;
    *) echo "ERROR: Unknown parameter: $1"; showHelp; exit 1;
esac; done


# --- read processlist and create helper table
pslist=$( ps -yle )
pslist2=$(
    for processname in $( echo "$pslist" | awk {'print $13'} | sort -u | grep -Fv "/")
    do
        grep " ${processname}$" <<< "$pslist"| awk '
        {x += $8;y += 1; process=$13}
        END {printf "%-15s %10.0f %5s %10.3f\n", process, x/1024, y, x/(y*1024)}' 2>/dev/null
    done | sort -k 2 -n -r
)

# --- generate output with most consuming processes

out=$(
    echo "$pslist2" | while read -r processname iSizeMB processcount
    do
        test $iSizeMB -lt $iWarnLimit && break

        test $iSizeMB -ge $iWarnLimit && status="Warning"
        test $iSizeMB -ge $iCriticalLimit && status="Critical"

        printf "%-9s %-20s %6s MB %4s %10s MB\n" $status $processname $iSizeMB $processcount
    done
)

iCountCritical=$( grep -c "^Critical" <<< "$out" )
iCountWarning=$(  grep -c "^Warning" <<< "$out" )

test $iCountWarning  -gt 0 && ph.setStatus "warning"
test $iCountCritical -gt 0 && ph.setStatus "critical"

# --- output

ph.status "Memory consuming processes - $iCountCritical processes use ${iCriticalLimit} MB+ (critical) ... $iCountWarning processes use ${iWarnLimit}..${iCriticalLimit} MB"
echo "$out"

ph.exit

# ----------------------------------------------------------------------