Nagios自定义僵尸进程检测脚本优化:多非nagios用户场景处理
优化方案:处理多账户僵尸进程的Nagios检测脚本
问题分析
原脚本的核心缺陷在于判断逻辑仅覆盖三种单一场景:仅nagios用户的僵尸进程、无僵尸进程、单一非nagios用户的僵尸进程。当存在**混合用户(如nagios+root+someuser)**时,$ZOMB会成为多行或空格分隔的用户列表,导致原有的等值判断全部失效,错误触发CRITICAL,但实际上nagios的僵尸进程应被忽略,仅需针对非nagios用户告警。
优化后的脚本
#!/bin/ksh STATE_OK=0 STATE_WARNING=1 STATE_CRITICAL=2 STATE_UNKNOWN=3 SCRIPTPATH=$(dirname "$0") # 替换原sed写法,更简洁可靠 if [[ -f ${SCRIPTPATH}/utils.sh ]]; then . ${SCRIPTPATH}/utils.sh # 加载nagios工具库 fi printvariables() { echo "Variables:" for i in EXITSTATUS EXITMESSAGE NON_NAGIOS_ZOMB_USERS do echo -n "$i : " eval echo \$${i} done echo } # 初始化默认状态 EXITSTATUS=$STATE_UNKNOWN EXITMESSAGE="UNKNOWN: Unexpected exit. Check script execution." # 提取非nagios用户的僵尸进程账户,去重并转为空格分隔格式 # 用awk直接处理,避免grep匹配自身进程的问题 NON_NAGIOS_ZOMB_USERS=$(ps -elf | awk '/Z.*defunct/ && $3 != "nagios" {print $3}' | sort -u | tr '\n' ' ') # 修剪末尾多余空格 NON_NAGIOS_ZOMB_USERS=$(echo "$NON_NAGIOS_ZOMB_USERS" | sed 's/ *$//') if [ -z "$NON_NAGIOS_ZOMB_USERS" ]; then # 无需要关注的僵尸进程(要么没有,要么仅nagios账户的) EXITSTATUS=$STATE_OK EXITMESSAGE="OK - No non-nagios defunct processes found" else # 存在非nagios用户的僵尸进程 EXITSTATUS=$STATE_CRITICAL EXITMESSAGE="CRITICAL - Defunct processes found owned by: $NON_NAGIOS_ZOMB_USERS" fi # Verbose模式输出变量详情 if [[ $VERBOSE -eq 1 ]] ; then printvariables fi echo ${EXITMESSAGE} exit $EXITSTATUS
关键优化点
- 提取逻辑优化:用awk直接筛选僵尸进程并排除nagios用户,避免了
grep误匹配自身进程的问题,一步完成过滤更高效。 - 多用户场景适配:专门提取非nagios的僵尸进程账户,只要该列表为空就返回OK,否则返回CRITICAL并列出所有违规账户。
- 路径处理简化:用
dirname "$0"替换原sed写法,避免转义字符干扰,逻辑更清晰。 - 告警信息明确:优化输出文案,精准区分“无违规进程”和“存在违规进程”的场景,便于运维快速定位问题。
内容的提问来源于stack exchange,提问作者jackcsprat
相关产品推荐
相关产品推荐

