3

我有这个运行:

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

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

现在,如果通过NRPENagios调用相同的脚本,则仅包含一行(第一行由 输出)。PS_ELFps

这让我很困惑;可能是什么原因?

也许这根本不限于 Nagios 或由 Nagios 引起,我只是为了完整起见将其包括在内。

我使用的是 SUSE Enterprise Linux 10 SP2 和 perl v5.8.8。

4

3 回答 3

2

我将“ps -eLf”更改为“ps -eLfww”(ww 表示无限输出),即使我不明白为什么远程调用时会有差异,这也解决了问题。

于 2009-02-05T18:00:57.663 回答
2

虽然这个问题很老了,但我今天遇到了完全相同的问题。所以我想我分享我的发现。问题在于,由 NRPE 守护程序创建的进程(可以)具有与您作为 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 环境变量。

于 2011-04-12T11:57:37.220 回答
1

这可能与 NRPE 插件的工作方式有关,而不是 Perl 本身。

您的插件的工作方式与此处解释的一样(返回代码 + 输出)?

于 2009-02-04T22:07:04.317 回答