linux-为什么用Nagios调用ps时,ps在Perl脚本中仅返回一行输出?

我正在运行:

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

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

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

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

也许这完全不限于Nagios /由Nagios引起,为了完整起见,我仅将其包括在内.

我正在使用SUSE Enterprise Linux 10 SP2和perl v5.8.8.

解决方法:

尽管此问题非常古老,但我今天遇到了完全相同的问题.
所以我以为我分享我的发现.
问题在于,由NRPE守护进程创建的进程(可以)所具有的环境不同于您以NRPE守护进程用户的身份直接在外壳中执行的进程.

我创建了以下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环境变量.

上一篇:Java基础 -> 对线程安全的理解


下一篇:Nagios 监控mysql服务器详细实现过程