NagiosXI Docker容器报返回码13越界错误的故障咨询
Nagios返回码13越界故障(Docker版XI环境)根因与修复
核心原因
Nagios对自定义检查插件的合法返回码有明确约束,仅接受0(正常)、1(警告)、2(严重)、3(未知)四个值,返回码13属于进程收到SIGPIPE(管道断开)信号后的异常退出值,在已经验证脚本权限正确、手动执行/UI手动触发命令正常的前提下,故障本质是Nagios核心调度进程的运行上下文,和手动执行脚本的运行上下文不一致,高概率触发点如下:
- 环境变量缺失:手动切nagios用户执行、UI点选触发命令时,会自动加载nagios用户的shell配置(包括
PATH、自定义环境变量),但Nagios调度服务是容器启动时以系统服务模式拉起的,不会加载用户级shell配置,脚本内如果用相对路径调用外部命令、依赖未显式定义的环境变量,执行过程中就会触发异常,管道场景下直接返回13。 - 输出长度超限:第三方Nagios XI镜像默认保留了官方版本的插件输出长度限制,若脚本输出内容(含标准输出、标准错误)超过默认阈值,Nagios会提前关闭读取管道,脚本进程收到SIGPIPE信号退出,返回码13。
- 运行时解释器不兼容:若脚本shebang头写为
#!/bin/sh,该镜像内/bin/sh链接到dash而非bash,脚本内如果使用了bash专属语法,手动执行时如果显式用bash调用不会报错,但调度器按shebang头调用dash执行就会触发异常,部分场景下返回码13。 - 容器安全策略拦截:第三方镜像默认开启了用户命名空间隔离,Nagios调度进程的运行权限上下文和手动切换到nagios用户的上下文存在差异,脚本如果涉及写临时文件、调用系统特权命令的操作,会被安全策略静默拦截,触发异常退出。
修复步骤
按顺序操作验证,每完成一步触发一次检查,确认问题是否解决:
- 规范脚本基础配置
- 将脚本首行shebang明确指定为
#!/bin/bash,不要使用#!/bin/sh - 脚本内所有调用的外部命令(如curl、mysql、自定义运维工具等)全部替换为绝对路径,可通过
which 命令名查询对应路径,例如将curl http://xxx修改为/usr/bin/curl http://xxx - 脚本依赖的所有环境变量在脚本内部显式定义,不要依赖用户profile文件加载的配置
- 将脚本首行shebang明确指定为
- 调整插件输出长度限制
进入容器编辑Nagios核心配置文件/usr/local/nagios/etc/nagios.cfg,新增/修改以下参数:
保存后执行命令重启Nagios服务生效:max_plugin_output_length=65536 max_service_check_output_length=65536systemctl restart nagios - 修正检查命令定义
在Nagios XI的命令配置页,将原直接调用脚本的命令行,改为显式通过bash执行,例如将:
修改为:/opt/scripts/your_check_script.sh $ARG1$/bin/bash /opt/scripts/your_check_script.sh $ARG1$ - 排除安全策略干扰
进入容器执行以下命令临时关闭强制访问控制:
若执行后检查恢复正常,将上述两行命令添加到容器启动脚本中永久生效。setenforce 0 2>/dev/null echo 0 > /sys/fs/selinux/enforce 2>/dev/null
排查技巧:如果以上步骤操作后仍未解决,可以在检查命令定义中添加重定向规则,将脚本执行的所有输出写入调试文件,例如
/bin/bash /opt/scripts/your_check_script.sh $ARG1$ > /tmp/nagios_check_debug.log 2>&1,等调度触发报错后查看该日志,可直接定位具体执行错误。
内容的提问来源于stack exchange,提问作者unknownexplorer
相关产品推荐
相关产品推荐

