Почему 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.

Ваш плагин работает, как описано здесь (код возврата + вывод)?

Другие вопросы по тегам