You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 11:35:36