1

Доброго времени суток господа линуксойды, прошу вашего совета, а то сам уже весь мозг сломал, не могу найти причину ac
Есть сервер с nagios, есть сервер с логами, на котором выполняется скрипт

#!/bin/bash                                                                                                                                                                                                    
exit_state=3                                                                                                                                                                                                   
STATE_OK=0                                                                                                                                                                                                     
STATE_CRITICAL=2                                                                                                                                                                                               
##################################                                                                                                                                                                             
                                                                                                                                                
                  sloterror=`/bin/cat /var/log/bd6808.log|tail -200| grep "CARD_HWFAIL"| wc -l`                                                                                                                
                  if (( $sloterror >= "1" ))                                                                                                                                                                   
                        then                                                                                                                                                                                   
                        echo "SLOT CRITICAL ERROR"                                                                                                                                                             
                            state=CRITICAL                                                                                                                                                                     
                                exit_state=$STATE_CRITICAL                                                                                                                                                     
                            else                                                                                                                                                                               
                        echo "BD slot OK"                                                                                                                                                                      
                                state=OK                                                                                                                                                                       
                                exit_state=$STATE_OK                                                                                                                                                           
                    fi                                                                                                                                                                                         
                                                                                                                                                                                                               
exit $exit_state                                                                                                                                                                                               
                    

Скрипт ищет ошибки в логе с текстом card_hwfail, считает сколько их штук и соответственно выводит результат, есть ошибки или нет, с ним все в порядке, т.е. считает все верно, но если на сервере с нагиосом выполнять этот скрипт по nrpe, то он постоянно показывает что ошибок нет

/usr/local/nagios/libexec/check_nrpe -H хх.хх.хх.хх -c check_slot
BD slot OK

Следовательно Nagios постоянно думает, что все работает нормально, подскажите пжста в какую сторону хоть копать

2

Может sloterror принимает какое-то неправильное значение?
Во-первых, замени | wc -l на -c. Ведь grep сам умеет считать число строк.
Во-вторых сделай отладочный вывод $sloterror, чтобы понять почему условие не выполняется.
В-третьих, не надо усложнять условия. >= "1" заменить бы на > 0.

3

Мне почему то кажется, что по NRPE не открывается лог, потому что если указать в скрипте $sloterror = 15; то я получаю желаемый результат, т.е. по NRPE sloterror принимает $STATE_CRITICAL
во первых и третих сейчас попробую, а отладочный вывод как сделать, подскажите пжста

4

Добавь вывод
echo "Debug sloterror: $sloterror"

5

На сервере получаем как и положено

SLOT CRITICAL ERROR
Debug sloterror: 21

на nagios получаем

BD slot OK
Debug sloterror: 0

6 (01.10.2012 11:48:30 отредактировано Vascom)

Ну раз 0, значит ошибок нет.
Значит всё работает как и задумано.

Если же там должно быть не 0, то смотри что у тебя в этом выражении на каждой стадии получается
`sloterror=`/bin/cat /var/log/bd6808.log|tail -200| grep "CARD_HWFAIL"| wc -l`

7

Ну на сервере с логом я то получаю sloterror и ошибки в логе есть

8

enjoy1288 пишет:

Ну на сервере с логом я то получаю sloterror и ошибки в логе есть

Что у тебя в этом выражении на каждой стадии получается?
`sloterror=`/bin/cat /var/log/bd6808.log|tail -200| grep "CARD_HWFAIL"| wc -l`

9

Сейчас пробую оставить только
sloterror=`/bin/cat /var/log/bd6808.log | grep "CARD_HWFAIL" -c`   
на сервере ошибка есть, а по NRPE ее нет

10

Что выдаёт /bin/cat /var/log/bd6808.log ?

11

Как и должно, содержимое файла bd6808.log

12

Ну а это?
/bin/cat /var/log/bd6808.log | grep "CARD_HWFAIL"

P.S. Что ж всё клещами вытягивать надо?

13

Наверное мы друг друга немного недопоняли:)
есть сервер "А", на котором находится этот скрипт и работает как надо, т.е. выполняет то, что от него требуется
есть сервер "B", на котором находится nagios и который по NRPE запускает вышесказанный скрипт, но результаты на А и В разные, т.е.
на А результат = "SLOT CRITICAL ERROR"
при запуске на В
/usr/local/nagios/libexec/check_nrpe -H **.**.**.** -c check_slot
результат = "BD slot OK"


/bin/cat /var/log/bd6808.log | grep "CARD_HWFAIL" как и положено ищет все строки в которых встречается CARD_HWFAIL

14

Ну так добавь больше отладочных выводов. Вот гляди, ты говоришь, что

/bin/cat /var/log/bd6808.log | grep "CARD_HWFAIL" как и положено ищет все строки в которых встречается CARD_HWFAIL

Но при этом вывод /bin/cat /var/log/bd6808.log | grep "CARD_HWFAIL" -c у тебя равен 0. Так не может быть!!!
Если вывод первого не пусто, то вывод второго не равен нулю. Противоречие. Разберись где ты запутался.

15 (01.10.2012 14:40:45 отредактировано enjoy1288)

запутался....
на сервере А сейчас есть строки с CARD_HWFAIL и результат скрипта  >0
Давайте попробуем заново разобрать скрипт

# открываем лог, в последних 200 строках ищем строку в которой имеется "CARD_HWFAIL"  и выводим количество таких строк
                          sloterror=`/bin/cat /var/log/bd6808.log|tail -200| grep "CARD_HWFAIL" -c`                                                                                                               
 # если количество строк больше 0, тогда статус CRITICAL ERROR             
             if (( $sloterror > "0" ))                                                                                                                                                                    
                        then                                                                                                                                                                                   
                        echo "SLOT CRITICAL ERROR"                                                                                                                                                             
                            state=CRITICAL                                                                                                                                                                     
                                exit_state=$STATE_CRITICAL  
# иначе статус OK                                                                                                                                                   
                            else                                                                                                                                                                               
                        echo "BD slot OK"                                                                                                                                                                      
                                state=OK                                                                                                                                                                       
                                exit_state=$STATE_OK                                                                                                                                                           
                    fi           

верно я понимаю? вроде ж не совсем дурак...:(

16

Верно.

17

Vascom пишет:

Но при этом вывод /bin/cat /var/log/bd6808.log | grep "CARD_HWFAIL" -c у тебя равен 0. Так не может быть!!!

равен 0 если запускаю на сервере B, а если на сервере А, то >0

18 (01.10.2012 14:46:17 отредактировано Vascom)

Хорошо. Теперь запишем в файл вывод этого /bin/cat /var/log/bd6808.log | grep "CARD_HWFAIL" > /tmp/gebug_script.log
И посмотрим как он выглядит в обоих случаях.

19 (01.10.2012 14:53:06 отредактировано enjoy1288)

на сервере А выдает это, 

./check_slot: line 12: ((: > 0 : ������ ����������: ��������� ������� (error token is "> 0 ")
BD slot OK

в debug_script.log пусто в обоих случаях

20

Эээ, покажи скрипт, что-то ты там не так изменил.
Это
/bin/cat /var/log/bd6808.log | grep "CARD_HWFAIL" > /tmp/gebug_script.log
надо было просто добавить в скрипт не меняя других строк.

21

пардон, исправил
при запуске на А в лог записались только строки с CARD_HWFAIL
при запуске на В в лог ничего не записалось, то бишь пусто

22

Отлично, теперь добавим ещё одну строку
/bin/cat /var/log/bd6808.log  > /tmp/gebug_script_full.log
И глазами посмотрим, есть ли там строки CARD_HWFAIL на самом деле, и вообще совпадают ли эти файлы.

23

При запуске на А имеем два лога, в одном строки только с CARD_HWFAIL
во втором все тоже самое, что и в оригинале лога (bd6808.log)

При запуске на В имеем два пустых лога

24

Так значит в этом и проблема.
Значит проблема или в cat или в правах на чтение файла или в путях.
Можно вообще отказаться от cat. Например попробуй сделать так tail -n 200 /var/log/bd6808.log  > /tmp/gebug_script_full.log

25

Вроде как заработало, проблема была с правами на bd6808.log, огромное, пингвинячье спасибо:) az

26

Пожалуйста ab
При возникновении проблемы, самый первый шаг - её локализация. Первым делом надо определить в каком компоненте проблема возникла.

27

Ну я изначально предположил что проблема в том, что лог не открывается по nrpe ab
но меня смутило то, что есть другой скрипт, который выполняет похожую функцию и его не смущали права на bd6808.log
И еще один вопрос: если лог регулярно архивируется, а на его месте создается другой, права нужно постоянно руками поправлять? или можно автоматизировать "выдачу" прав файлу?

28 (01.10.2012 16:00:57 отредактировано Vascom)

Можно автоматизировать конечно. Например проверять права и если они неправильные - менять. Записать этот алгоритм в скрипт и запускать его периодически по cron.

29

спасибо, будем учить

30

Рекомендую http://www.bash-scripting.ru/abs/chunks/index.html
Например тут http://www.bash-scripting.ru/abs/chunks/ch07s02.html

-r
имеется право на чтение файла (для пользователя вызвавшего проверку)