RHEL环境下Nagios自定义插件异常:CLI正常但WebGUI返回未知状态
解决Nagios执行自定义脚本返回未知状态的问题
看起来你碰到了Nagios自定义脚本的常见坑——命令行跑正常,但Nagios执行就返回未知状态。结合你给出的信息,我帮你梳理几个最可能的原因和解决办法:
1. 脚本语法不完整(最直接的问题)
你提供的脚本内容明显没写完:elif((204800<$rootU...这里截断了,语法不完整的脚本在Nagios执行时会直接报错,导致返回未知状态。先把脚本补全,同时我建议优化下获取目录大小的方式(用awk比cut更可靠,因为du的输出是数字+空格+路径),完整的脚本示例如下:
#!/bin/bash # 用awk提取du输出的第一个字段(大小,单位KB) rootUsage=$(/usr/bin/du -s /root | /usr/bin/awk '{print $1}') output=$rootUsage if ((rootUsage <= 204800)); then echo "OK. root storage is : $output KB" exit 0 # Nagios OK状态码 elif ((rootUsage > 204800 && rootUsage <= 409600)); then echo "WARNING. root storage is : $output KB" exit 1 # Nagios WARNING状态码 else echo "CRITICAL. root storage is : $output KB" exit 2 # Nagios CRITICAL状态码 fi
2. Nagios用户权限不足(最常见的隐形问题)
默认情况下/root目录的权限是drwx------,只有root用户能访问。你说nagios用户能执行脚本,但要确认它是否能读取/root目录的内容:
- 切换到nagios用户测试:
如果输出su - nagios -s /bin/bash /usr/bin/du -s /rootPermission denied,那就是权限问题。
解决办法(二选一):
- 方法一:用sudo授权(更安全)
编辑/etc/sudoers文件(用visudo命令编辑,避免语法错误),添加一行:
然后修改脚本里的du命令为:nagios ALL=(ALL) NOPASSWD: /usr/bin/du -s /rootrootUsage=$(sudo /usr/bin/du -s /root | /usr/bin/awk '{print $1}') - 方法二:修改/root目录权限(不推荐,有安全风险)
给/root目录添加其他用户的读权限:chmod o+x /root
3. 环境变量差异问题
Nagios执行脚本时的环境变量和你命令行登录的环境不一样,比如PATH可能不包含系统命令的路径,导致找不到du或awk。所以建议在脚本里始终使用命令的绝对路径(比如/usr/bin/du而不是du),避免依赖环境变量。
4. Nagios命令配置错误
检查你的Nagios command定义是否正确,比如:
command_name check_root_storage command_line $USER1$/check_root_storage.sh }
确保$USER1$指向的是/usr/local/nagios/libexec/,并且服务定义里正确调用了这个command,没有拼写错误。
内容的提问来源于stack exchange,提问作者sree
相关产品推荐
相关产品推荐

