NPCD: ERROR: Executed command exits with return code '255'

NPCD: ERROR: Executed command exits with return code '255'

更新 cpan 中的模块后 pnp4nagios/NPCD 开始在每次调用脚本时在我的系统日志中记录以下内容;

NPCD[19673]: ERROR: Executed command exits with return code '255'
NPCD[19673]: ERROR: Command line was '/etc/pnp4nagios/libexec/process_perfdata.pl -n --bulk /var/spool/icinga2/perfdata/host-perfdata.1524923929'

似乎没有任何功能或数据损失,我的图表也按预期填充 - 但我被这个垃圾邮件所困扰。

运行 来自 cli 的脚本给出了这个结果;

bash-4.1$ /etc/pnp4nagios/libexec/process_perfdata.pl -n --bulk /var/spool/icinga2/perfdata/host-perfdata.1524919009 
tv_interval() 2nd argument should be an array reference at /etc/pnp4nagios/libexec/process_perfdata.pl line 218, <PDFILE> line 111

该错误的唯一有用 google 结果指向 Time::HiRes 模块。

看来是Time::HiRes当前版本was/is的问题。 cpan 提供 Time-HiRes-1.9758 作为更新,但这似乎是导致问题的版本。

为了停止错误,我不得不通过执行以下操作来降级该模块;

make clean 在安装版本的文件夹中(我的在 .cpan/build/Time-HiRes-1.9758)然后从 cpan 中获取特定版本;

cpan JHI/Time-HiRes-1.9721.tar.gz 安装了较旧的 (1.9721) 版本。

重新启动 npcd 错误消失了。

我不确定 Time-HiRes 的哪个版本引入了这个 error/change 行为,因为我没有经历过它们,也不能 100% 确定问题实际可能出在哪里(npcd/Time-HiRes/somewhere 其他)。希望这能为其他人指明正确的方向。

来自ikegami's条评论

"Even in version 1.9721, the second argument (if provided), must be an array reference. It seems the only change in behaviour is the addition of input validation. process_perfdata.pl is buggy, and newer versions of Time::HiRes let you know it."

即使在最新版本的 pnp4nagios 中也是一个问题。 如果您需要快速解决方法,您可以修改 pnp4nagios 脚本 process_perfdata.pl 以便它始终传递数组引用,如下所示(差异输出):

 sub main {
     my $job = shift;
     my $t0 = [gettimeofday];
-    my $t1;
+    my @t1=();
+    my $t1=\@t1;
     my $rt;
     my $lines = 0;
     # Gearman Worker

我已经这样做了,它似乎工作正常并删除了非常频繁的错误消息。如果它似乎引起问题,我会 post 回到这里。

问题出在最新的库 Time:HiRes 1.9758 和来自 tv_interval 边界的第二个值。根据手册,如果省略,则使用实际时间 - 它的作用是什么。所以你需要将这个命令应用到脚本 process_perfdata.pl:

sed -s 's/tv_interval $t0, $t1/tv_interval $t0/g' -i process_perfdata.pl

之后一切都会正常进行。 我遇到了 CentOS8 的问题,它没有提供旧版本的 HiRes 库。另一个症状是 npcd 无法创建 .pnp-internal 文件夹。