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


person Node    schedule 04.02.2009    source источник
comment
Попробуйте направить вывод в файл, чтобы убедиться, что 'ps' внутри скрипта работает должным образом. Может быть, что-то вроде /bin/ps -eLf > /tmp/psout.txt;   -  person codelogic    schedule 05.02.2009
comment
Спасибо! :) Я попробовал это и, как ни странно, каждая строка ps -eLf обрезается после 80 символов. Но только когда я запускаю скрипт через nrpe/remote. :-/   -  person Node    schedule 05.02.2009
comment
Хм, хорошо, я нашел ошибку. Я изменил ps -eLf на ps -eLfww, и все работает нормально. Но я до сих пор не могу объяснить, почему есть разница между локальным и удаленным выполнением. Может быть, некоторые переменные env.   -  person Node    schedule 05.02.2009


Ответы (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.

person xorpaul    schedule 12.04.2011

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

person Node    schedule 05.02.2009

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

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

person sebthebert    schedule 04.02.2009
comment
Да, выходной код и код возврата установлены в соответствии с документацией. :-/ Я загрузил полный скрипт, может это поможет понять мою проблему: home.arcor.de /reik/check_threads - person Node; 05.02.2009