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

时间:2009-02-04 21:07:52

标签: linux perl nagios nrpe

我正在运行:

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

如果在本地调用,则循环运行得很好,每ps -eLf

的输出行一次

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

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

也许这根本不仅限于/由Nagios造成,我只是为了完整而加入它。

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

3 个答案:

答案 0 :(得分:2)

我将'ps -eLf'更改为'ps -eLfww'(ww用于无限输出),这解决了问题,即使我不理解为什么远程调用时会有差异。

答案 1 :(得分: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环境变量。

答案 2 :(得分:1)

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

你的插件就像解释here(返回代码+输出)一样工作?