fixes & optimizations (pdksh)

This commit is contained in:
Patrick Van der Veken 2019-03-15 22:15:06 +01:00
parent fec2f92040
commit 79f813434a

View File

@ -19,7 +19,7 @@
# @(#) MAIN: check_linux_process_limits # @(#) MAIN: check_linux_process_limits
# DOES: see _show_usage() # DOES: see _show_usage()
# EXPECTS: see _show_usage() # EXPECTS: see _show_usage()
# REQUIRES: data_comma2space(), init_hc(), log_hc(), data_is_numeric() # REQUIRES: data_comma2space(), data_is_numeric(), init_hc(), log_hc(), warn())
# #
# @(#) HISTORY: # @(#) HISTORY:
# @(#) 2018-07-10: original version [Patrick Van der Veken] # @(#) 2018-07-10: original version [Patrick Van der Veken]
@ -27,6 +27,7 @@
# @(#) 2018-10-28: fixed (linter) errors [Patrick Van der Veken] # @(#) 2018-10-28: fixed (linter) errors [Patrick Van der Veken]
# @(#) 2018-11-18: do not trap on signal 0 [Patrick Van der Veken] # @(#) 2018-11-18: do not trap on signal 0 [Patrick Van der Veken]
# @(#) 2019-01-27: arguments fix [Patrick Van der Veken] # @(#) 2019-01-27: arguments fix [Patrick Van der Veken]
# @(#) 2019-03-13: fixes & optimizations (pdksh) [Patrick Van der Veken]
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# DO NOT CHANGE THIS FILE UNLESS YOU KNOW WHAT YOU ARE DOING! # DO NOT CHANGE THIS FILE UNLESS YOU KNOW WHAT YOU ARE DOING!
#****************************************************************************** #******************************************************************************
@ -36,7 +37,7 @@ function check_linux_process_limits
{ {
# ------------------------- CONFIGURATION starts here ------------------------- # ------------------------- CONFIGURATION starts here -------------------------
typeset _CONFIG_FILE="${CONFIG_DIR}/$0.conf" typeset _CONFIG_FILE="${CONFIG_DIR}/$0.conf"
typeset _VERSION="2019-01-27" # YYYY-MM-DD typeset _VERSION="2019-03-13" # YYYY-MM-DD
typeset _SUPPORTED_PLATFORMS="Linux" # uname -s match typeset _SUPPORTED_PLATFORMS="Linux" # uname -s match
# ------------------------- CONFIGURATION ends here --------------------------- # ------------------------- CONFIGURATION ends here ---------------------------
@ -115,7 +116,7 @@ fi
# check PROCESS stanzas # check PROCESS stanzas
grep -i '^process' ${_CONFIG_FILE} 2>/dev/null |\ grep -i '^process' ${_CONFIG_FILE} 2>/dev/null |\
while IFS=';' read _ _PROCESS _PROCESS_LIMIT _PROCESS_SOFT_THRESHOLD _PROCESS_HARD_THRESHOLD while IFS=';' read -r _ _PROCESS _PROCESS_LIMIT _PROCESS_SOFT_THRESHOLD _PROCESS_HARD_THRESHOLD
do do
# check for empties # check for empties
if [[ -z "${_PROCESS}" || -z "${_PROCESS_LIMIT}" ]] if [[ -z "${_PROCESS}" || -z "${_PROCESS_LIMIT}" ]]
@ -123,23 +124,19 @@ do
warn "missing parameter in configuration file ${_CONFIG_FILE} at data line ${_LINE_COUNT}" warn "missing parameter in configuration file ${_CONFIG_FILE} at data line ${_LINE_COUNT}"
return 1 return 1
fi fi
if [[ -n "${_PROCESS_SOFT_THRESHOLD}" ]] data_is_numeric "${_PROCESS_SOFT_THRESHOLD}"
# shellcheck disable=SC2181
if (( $? > 0 ))
then then
data_is_numeric "${_PROCESS_SOFT_THRESHOLD}" warn "parameter is not numeric in configuration file ${_CONFIG_FILE} at data line ${_LINE_COUNT}"
if (( $? > 0 )) return 1
then
warn "parameter is not numeric in configuration file ${_CONFIG_FILE} at data line ${_LINE_COUNT}"
return 1
fi
fi fi
if [[ -n "${_PROCESS_HARD_THRESHOLD}" ]] data_is_numeric "${_PROCESS_HARD_THRESHOLD}"
# shellcheck disable=SC2181
if (( $? > 0 ))
then then
data_is_numeric "${_PROCESS_HARD_THRESHOLD}" warn "parameter is not numeric in configuration file ${_CONFIG_FILE} at data line ${_LINE_COUNT}"
if (( $? > 0 )) return 1
then
warn "parameter is not numeric in configuration file ${_CONFIG_FILE} at data line ${_LINE_COUNT}"
return 1
fi
fi fi
# which limit to check? # which limit to check?
@ -153,7 +150,7 @@ do
warn "${_PROCESS_LIMIT}: could not find any matching processes for process ${_PROCESS}" warn "${_PROCESS_LIMIT}: could not find any matching processes for process ${_PROCESS}"
continue continue
fi fi
print "${_PROCESS_PS}" | while read _PROCESS_PS_PID _PROCESS_PS_USER print "${_PROCESS_PS}" | while read -r _PROCESS_PS_PID _PROCESS_PS_USER
do do
(( ARG_DEBUG > 0 )) && debug "${_PROCESS_LIMIT}: checking process ${_PROCESS_PS_PID}" (( ARG_DEBUG > 0 )) && debug "${_PROCESS_LIMIT}: checking process ${_PROCESS_PS_PID}"
# get current values and check thresholds # get current values and check thresholds
@ -179,7 +176,7 @@ done
# check USER stanzas # check USER stanzas
_LINE_COUNT=0 _LINE_COUNT=0
grep -i '^user' ${_CONFIG_FILE} 2>/dev/null |\ grep -i '^user' ${_CONFIG_FILE} 2>/dev/null |\
while IFS=';' read _ _USER _USER_LIMIT _USER_SOFT_THRESHOLD _USER_HARD_THRESHOLD while IFS=';' read -r _ _USER _USER_LIMIT _USER_SOFT_THRESHOLD _USER_HARD_THRESHOLD
do do
# check for empties # check for empties
if [[ -z "${_USER}" || -z "${_USER_LIMIT}" ]] if [[ -z "${_USER}" || -z "${_USER_LIMIT}" ]]
@ -187,18 +184,22 @@ do
warn "missing parameter in configuration file ${_CONFIG_FILE} at data line ${_LINE_COUNT}" warn "missing parameter in configuration file ${_CONFIG_FILE} at data line ${_LINE_COUNT}"
return 1 return 1
fi fi
# check optional value
if [[ -n "${_USER_SOFT_THRESHOLD}" ]] if [[ -n "${_USER_SOFT_THRESHOLD}" ]]
then then
data_is_numeric "${_USER_SOFT_THRESHOLD}" data_is_numeric "${_USER_SOFT_THRESHOLD}"
# shellcheck disable=SC2181
if (( $? > 0 )) if (( $? > 0 ))
then then
warn "parameter is not numeric in configuration file ${_CONFIG_FILE} at data line ${_LINE_COUNT}" warn "parameter is not numeric in configuration file ${_CONFIG_FILE} at data line ${_LINE_COUNT}"
return 1 return 1
fi fi
fi fi
# check optional value
if [[ -n "${_USER_HARD_THRESHOLD}" ]] if [[ -n "${_USER_HARD_THRESHOLD}" ]]
then then
data_is_numeric "${_USER_HARD_THRESHOLD}" data_is_numeric "${_USER_HARD_THRESHOLD}"
# shellcheck disable=SC2181
if (( $? > 0 )) if (( $? > 0 ))
then then
warn "parameter is not numeric in configuration file ${_CONFIG_FILE} at data line ${_LINE_COUNT}" warn "parameter is not numeric in configuration file ${_CONFIG_FILE} at data line ${_LINE_COUNT}"
@ -217,7 +218,7 @@ do
warn "${_USER_LIMIT}: could not find any matching processes for user ${_USER}" warn "${_USER_LIMIT}: could not find any matching processes for user ${_USER}"
continue continue
fi fi
print "${_USER_PS}" | while read _USER_PS_PID _USER_PS_COMM print "${_USER_PS}" | while read -r _USER_PS_PID _USER_PS_COMM
do do
(( ARG_DEBUG > 0 )) && debug "${_USER_LIMIT}: checking process ${_USER_PS_PID}" (( ARG_DEBUG > 0 )) && debug "${_USER_LIMIT}: checking process ${_USER_PS_PID}"
# get current values and check thresholds # get current values and check thresholds
@ -307,7 +308,7 @@ then
_LIMIT_ENTRY=$(grep -i "${_LIMIT_NAME}" /proc/${_LIMIT_PID}/limits 2>/dev/null) _LIMIT_ENTRY=$(grep -i "${_LIMIT_NAME}" /proc/${_LIMIT_PID}/limits 2>/dev/null)
if [[ -z "${_LIMIT_ENTRY}" ]] if [[ -z "${_LIMIT_ENTRY}" ]]
then then
warn "${_LIMIT_TYPE}: unable to gather limits information (${_LIMIT_PID}/${_LIMIT_USER}/${_LIMIT_PROCESS})" warn "${_LIMIT_TYPE}: unable to gather limits information for 'Max open files' (${_LIMIT_PID}/${_LIMIT_USER}/${_LIMIT_PROCESS})"
return 1 return 1
fi fi
case "${_LIMIT_TYPE}" in case "${_LIMIT_TYPE}" in
@ -325,18 +326,28 @@ then
"Max processes") "Max processes")
case "${_LIMIT_TYPE}" in case "${_LIMIT_TYPE}" in
soft) soft)
_LIMIT_COMMAND="ulimit -a" _LIMIT_COMMAND="ulimit -u 2>/dev/null"
# workaround for cr@ppy pdksh/mirksh
if (( IS_PDKSH > 0 ))
then
_LIMIT_COMMAND="ulimit -a | grep 'processes' 2>/dev/null | awk '{print \$2}' 2>/dev/null"
fi
;; ;;
hard) hard)
_LIMIT_COMMAND="ulimit -Ha" _LIMIT_COMMAND="ulimit -Hu 2>/dev/null"
# workaround for cr@ppy pdksh/mirksh
if (( IS_PDKSH > 0 ))
then
_LIMIT_COMMAND="ulimit -Ha | grep 'processes' 2>/dev/null | awk '{print \$2}' 2>/dev/null"
fi
;; ;;
esac esac
_LIMIT_VALUE=$(su - ${_LIMIT_USER} -c "${_LIMIT_COMMAND}" 2>/dev/null |\ _LIMIT_VALUE=$(su - "${_LIMIT_USER}" -c "${_LIMIT_COMMAND}")
grep -i "max user processes" 2>/dev/null | sed -s "s/max user processes//g" 2>/dev/null |\ data_is_numeric "${_LIMIT_VALUE}"
awk '{ print $2}' 2>/dev/null) # shellcheck disable=SC2181
if [[ -z "${_LIMIT_VALUE}" ]] if (( $? > 0 ))
then then
warn "${_LIMIT_TYPE}: unable to gather limits information (${_LIMIT_USER})" warn "${_LIMIT_TYPE}: unable to gather limits information for 'Max processes' (${_LIMIT_USER})"
return 1 return 1
fi fi
_MSG_BIT="${_LIMIT_USER}" _MSG_BIT="${_LIMIT_USER}"
@ -375,6 +386,7 @@ function _get_open_files
{ {
(( ARG_DEBUG > 0 && ARG_DEBUG_LEVEL > 0 )) && set ${DEBUG_OPTS} (( ARG_DEBUG > 0 && ARG_DEBUG_LEVEL > 0 )) && set ${DEBUG_OPTS}
# shellcheck disable=SC2012
ls -f /proc/${1}/fd/ 2>/dev/null | wc -l 2>/dev/null ls -f /proc/${1}/fd/ 2>/dev/null | wc -l 2>/dev/null
return 0 return 0
@ -385,7 +397,7 @@ function _get_processes
{ {
(( ARG_DEBUG > 0 && ARG_DEBUG_LEVEL > 0 )) && set ${DEBUG_OPTS} (( ARG_DEBUG > 0 && ARG_DEBUG_LEVEL > 0 )) && set ${DEBUG_OPTS}
ps -U ${1} --no-headers 2>/dev/null | wc -l 2>/dev/null ps -U "${1}" --no-headers 2>/dev/null | wc -l 2>/dev/null
return 0 return 0
} }