几周以来,我一直在敲打NRPE和Perl.
我决定从绝对的第一原则开始,并创建一个虚拟的nagios插件,除了总是返回OK之外什么都不做.我将其命名为check_true.pl,将其安装在远程服务器上并配置NRPE以将其作为check_test提供.
整个脚本只是:
#!/usr/bin/perl print "OK - this dummy test always returns OK\n"; exit 0;
这对NRPE没有问题.
以此为出发点,我打算慢慢构建我想要的脚本,看看它在什么时候断开.我没有到目前为止.以下内容针对NRPE(但在本地和SSH上工作正常):
#!/usr/bin/perl use strict; print "OK - this dummy test always returns OK\n"; exit 0;
我不能包含任何内容或我收到此错误.这使我无法做我真正需要做的事情!
我认为这可能是perl include路径的一个问题,但在NRPE上运行以下表明它不是(给出与在终端上运行时相同的包含路径):
#!/usr/bin/perl print "OK - Perl include path: ".join(q{,},@INC)."\n"; exit 0;
有谁知道为什么NRPE在Perl中的表现如此糟糕?任何人都可以推荐修复?甚至是一种解决方法?
更新1:
该命令在NRPE中定义如下:
command[check_test]=/usr/lib64/nagios/plugins/check_true.pl
更新2:
我做了一些调试,通过在perl脚本周围添加包装器,我能够捕获STDERR.
#!/bin/sh out=`/usr/lib64/nagios/plugins/check_true.pl 2>&1` echo $out
结果让事情变得更加混乱:
Can't locate strict.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/lib64/nagios/plugins/check_true.pl line 3. BEGIN Failed--compilation aborted at /usr/lib64/nagios/plugins/check_true.pl line 3.
快速搜索显示strict.pm位于/usr/share/perl5/strict.pm,/usr/share / perl5 IS位于列出的@INC中!
Perl怎么能找不到那个文件呢?当作为终端中的用户nagios运行时,这可以完美地工作,那么NRPE对环境做什么来搞乱Perl?