Плагин Nagios не работает

У меня возникла проблема, когда я пытаюсь перенести мой bash-скрипт на nagios. Скрипты работают нормально, когда я запускаю на консоли, но когда я запускаю его из Nagios, я получаю сообщение "(null)" - В журнале отладки nagios я видим, что он хорошо разбирает скрипт, но возвращает ошибку msg..

Я не очень хорош в написании сценариев, так что, думаю, мне понадобится помощь

Цель сценария - проверить версию *.ears с некоторых серверов, md5 их и сравнить выходные данные, чтобы увидеть, совпадает ли версия или нет. Для этого у меня на этих серверах есть json, который печатает имя *.ear и его md5.

итак... Первая часть скрипта получает эту информацию от json с curl и сохраняет только номер md5 в.tempfile, затем сравнивает оба временных файла, и если они совпадают, я получаю сообщение $STATE_OK. Если они этого не делают, он создает файл.datetmp с датой (цель этого состоит в том, чтобы напечатать сообщение после 48 часов несоответствия). Затем я делаю diff файла.datetmp и в дни, когда я хочу проверить, меньше ли результат 48 часов, он печатает $STATE_WAR, если результат больше 48 часов, он печатает $STATE_CRI

Синтаксис сценария: " $ sh script.sh nameoftheear.ear server1 server2 "

заранее спасибо

#/bin/bash

#Variables For Nagios
cont=$1
bas1=$2
bas2=$3

## Here you set the servers hostname
svr1= curl -s "http://$bas1.domain.com:7877/apps.json" | grep -Po '"EAR File":.*? [^\\]",' | grep $cont | awk '{ print $5 }' > .$cont-tmpsvr1
svr2= curl -s "http://$bas2.domain.com:7877/apps.json" | grep -Po '"EAR File":.*? [^\\]",' | grep $cont | awk '{ print $5 }' > .$cont-tmpsvr2
file1=.$cont-tmpsvr1
file2=.$cont-tmpsvr2
md51=$(head -n 1 .$cont-tmpsvr1)
md52=$(head -n 1 .$cont-tmpsvr2)
datenow=$(date +%s)

#Error Msg
ERR_WAR="Not updated $bas1: $cont $md51 --- $bas2: $cont $md52 "
ERR_CRI="48 hs un-updated $bas1: $cont $md51 --- $bas2: $cont $md52 "
OK_MSG="Is up to date $bas1: $cont $md51 --- $bas2: $cont $md52 "

STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2


##Matching md5 Files
if cmp -s "$file1" "$file2"
then
    echo $STATE_OK
    echo $OK_MSG
# I do the rm to delete the date tmp file so i can get the $STATE_OK or $STATE_WARNING
    rm .$cont-datetmp
    exit 0

elif
    echo $datenow >> .$cont-datetmp

#Vars to set modification date

datetmp=$(head -n 1 .$cont-datetmp)
diffdate=$(( ($datenow - $datetmp) /60 ))

#This var is to set the time of the critical ERR

days=$((48*60))

[ $diffdate -lt $days ]

then
    echo $STATE_WARNING
    echo $ERR_WAR
    exit 1
 else
    echo $STATE_CRITICAL
    echo $ERR_CRI
    exit 2
 fi

1 ответ

Решение

Я предполагаю какую-то проблему с разрешениями - точнее, я не думаю, что пользователь nagios может писать в свой домашний каталог. Вы либо исправляете эти разрешения, либо записываете файл в /tmp (и рассматриваете возможность использования mktemp?). ... но в идеале вы бы пропустили запись всех этих файлов, насколько я могу видеть, что все эти сравнения и т. д. могут храниться в памяти.

ОБНОВИТЬ

Посмотрел ваш скрипт еще раз - я вижу некоторые очевидные ошибки, на которые вы можете посмотреть:

  • Вы распечатываете значение выхода, прежде чем распечатать сообщение.
  • Вы печатаете значение выхода, а не выход со значением выхода.

... вот так:

echo $STATE_WARNING
echo $ERR_WAR
exit 1

Скорее должно быть:

echo $ERR_WAR
exit $STATE_WARNING

Также мне интересно, действительно ли это сценарий или вы что-то пропустили при вставке. Кажется, в вашем последнем куске кода пропущено "если", а также лишний разрыв строки? Скорее должно быть:

if [ $diffdate -lt $days ]
then
  ...
else
  ...
fi
Другие вопросы по тегам