Почему ps возвращает только одну строку вывода в моем скрипте Perl, когда я вызываю его с помощью Nagios?
У меня это работает:
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.
3 ответа
Хотя эта проблема очень старая, сегодня я столкнулся с точно такой же проблемой. Так что я поделился тем, что нашел. Проблема заключается в том, что процессы, созданные демоном NRPE (могут), имеют среду, отличную от процессов, которые вы выполняете непосредственно в оболочке в качестве пользователя демона NRPE.
Я создал следующий скрипт bash:
#!/bin/bash
echo `env | grep COLUMNS`
Это дает мне переменную окружения COLUMN текущего процесса, которая имеет ту же среду, что и родительский процесс (процесс, разветвленный демоном NRPE).
Когда я выполняю этот скрипт как пользователь демона NRPE
$ /tmp/check_env.sh
COLUMNS=174
это дает мне значение моего текущего окна оболочки. Но когда я выполняю этот скрипт через NRPE, я получаю:
nagios-server $ check_nrpe -H client -c check_env
COLUMNS=80
Вот почему вывод ps -eaf ограничен 80 символами, если вы не используете параметр ww для неограниченной ширины, который игнорирует переменную среды COLUMNS.
Я изменил 'ps -eLf' на 'ps -eLfww' (ww для неограниченного вывода), и это устранило проблему, даже если я не понимаю, почему существует разница при удаленном вызове.
Вероятно, это больше связано с тем, как работают плагины NRPE, чем с самим Perl.
Ваш плагин работает, как описано здесь (код возврата + вывод)?