Почему ps возвращает только одну строку вывода в моем скрипте Perl, когда я вызываю его с помощью Nagios? - PullRequest
3 голосов
/ 05 февраля 2009

у меня это работает:

if (open(PS_ELF, "/bin/ps -eLf|")) {
  while (<PS_ELF>) {
    if ($_ =~ m/some regex/) {
      # do some stuff
    }
  }
}

При локальном вызове цикл работает нормально, один раз для каждой строки вывода ps -eLf

Теперь, если тот же скрипт вызывается из Nagios через NRPE , PS_ELF содержит только одну строку (вывод первой строки ps).

Это озадачивает меня; в чем может быть причина?

Может быть, это не ограничивается / вызвано Нагиосом вообще, я просто включил его для полноты картины.

Я использую SUSE Enterprise Linux 10 SP2 и perl v5.8.8.

Ответы [ 3 ]

2 голосов
/ 05 февраля 2009

Я изменил 'ps -eLf' на 'ps -eLfww' (ww для неограниченного вывода), и это устранило проблему, даже если я не понимаю, почему существует разница при удаленном вызове.

2 голосов
/ 12 апреля 2011

Хотя эта проблема очень старая, сегодня я столкнулся с точно такой же проблемой. Вот я и поделился тем, что нашел. Проблема заключается в том, что процессы, созданные демоном 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.

1 голос
/ 05 февраля 2009

Вероятно, это больше связано с тем, как работают плагины NRPE, чем с самим Perl.

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

...