我正在运行:
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造成,我只是为了完整而加入它。
我使用的是SUSE Enterprise Linux 10 SP2和perl v5.8.8。
答案 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(返回代码+输出)一样工作?