我正在运行:
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环境变量.