Плагин 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