为什么当我用Nagios调用它时,ps只会在Perl脚本中返回一行输出?

我有这个运行:

if (open(PS_ELF, "/bin/ps -eLf|")) { while (<PS_ELF>) { if ($_ =~ m/some regex/) { # do some stuff } } } 

如果在本地调用,则循环运行得很好,一次对于ps -eLf每个输出行

现在,如果通过NRPE从Nagios调用相同的脚本,则PS_ELF只包含一行( ps输出的第一行)。

这使我感到困惑。 可能是什么原因?

也许这并不仅限于/由Nagios所引起的,我只是为了完整而将其纳入其中。

我在SUSE Enterprise Linux 10 SP2和perl v5.8.8上。

虽然这个问题很老,但我今天遇到了同样的问题。 所以我想我分享我发现的东西。 问题是由NRPE守护程序(can)创建的进程与作为NRPE守护进程用户在shell中直接执行的进程具有不同的环境。

我创建了以下bash脚本:

 #!/bin/bash echo `env | grep COLUMNS` 

这给了我当前进程的环境变量COLUMN,它具有与父进程(由NRPE守护进程分叉的进程)相同的环境。

当我作为NRPE守护进程用户执行这个脚本

 $ /tmp/check_env.sh COLUMNS=174 

它给了我当前shell窗口的价值。 但是当我通过NRPE执行这个脚本时,我得到:

 nagios-server $ check_nrpe -H client -c check_env COLUMNS=80 

这就是为什么ps -eaf输出限制为80个字符,除非您使用ww参数设置无限宽度,忽略COLUMNS环境变量。

我改变了'ps -eLf'为'ps -eLfww'(ww为无限输出),这就解决了这个问题,即使我不明白为什么远程调用时有什么区别。

对于NRPE插件如何工作可能比Perl本身更有用。

你的插件是像这里解释的(返回码+输出)?