我有这个运行:
if (open(PS_ELF, "/bin/ps -eLf|")) { while (<PS_ELF>) { if ($_ =~ m/some regex/) { # do some stuff } } }
如果在本地调用,则循环运行得很好,一次对于ps -eLf
每个输出行
现在,如果通过NRPE从Nagios调用相同的脚本,则PS_ELF
只包含一行( ps
输出的第一行)。
这使我感到困惑。 可能是什么原因?
也许这并不仅限于/由Nagios所引起的,我只是为了完整而将其纳入其中。
我在SUSE Enterprise Linux 10 SP2和perl v5.8.8上。
虽然这个问题很老,但我今天遇到了同样的问题。 所以我想我分享我发现的东西。 问题是由NRPE守护程序(can)创建的进程与作为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环境变量。
我改变了'ps -eLf'为'ps -eLfww'(ww为无限输出),这就解决了这个问题,即使我不明白为什么远程调用时有什么区别。
对于NRPE插件如何工作可能比Perl本身更有用。
你的插件是像这里解释的(返回码+输出)?