Статья о том, как написать shell script для мониторинга приложения.

Пример варианта мониторинга сервера приложений на основе shell скрипта.

Постановка задачи

Задача возникла неожиданно. Разработка стороннего производителя – JMS программа под сервер приложений. Получили, настроили, заработало, пожали руки, все здорово. Через несколько дней сервер задумался. Перезапустили, все наладилось. Дальше слушаем музыку, читаем новости, почту, пишем блоги. Прошло еще три дня и сервер снова подвис. Пришлось отодвинуть кофе и посмотреть в логи. В server.log нам сообщали «java.lang.OutOfMemoryError»

Как же быть

Осознав наличие проблемы с программой стороннего производителя, было бы логично привлечь этого производителя к исправлению его разработки. Но, к сожалению, производитель находился вне зоны действия сети и когда он попадет в эту зону действия неизвестно. Можно было бы вникнуть в логику JMS программы и переписать ее, но на это требовались ресурсы, которые никто оплачивать не собирался. Нам виделись всего лишь два выхода из ситуации. Нанять старушку, для наблюдения за сервером или написать скрипт для проверки лог файлов и перезагрузки сервера. Мы подкинули монетку, и выпала решка.

Решение

Вот что у нас получилось:
Первым делом установим необходимые переменные, дабы избежать зависимости от путей.

 #!/bin/sh

 ### Set script variables ###

 # Script path Where this file placed
 SCRIPT_PATH=/public/script/log-checker

 # Log file for current status
 INFOLOGFILE=$SCRIPT_PATH/last_started.log

 # Log file for restart status
 RESTARTLOGFILE=$SCRIPT_PATH/restart.log

 # Application server root path
 SERVER _DIR=/usr/local/orion

 # Current date Just for logging
 CURRENT_DATE=$(date +%d-%m-%y" "%H:%M:%S)

 # Error message for each check
 ERROR_MESSAGE=java.lang.OutOfMemoryError

Теперь напишем код для проверки и можно дальше пить кофе, слушать музыку и писать блоги.

 ### Start ###
 # Write date of last start to INFOLOGFILE
 echo $CURRENT_DATE > $INFOLOGFILE

Обратите внимание. Этот лог будет содержать всегда одну запись – время последнего запуска скрипта. Файл будет перезаписан. Об этом нам говорит одна стрелка - >. Ниже будет строчка с двумя стрелками - >>, в этом случае запись добавляется к уже существующим! Зачем это мы сделали? Просто нам так нравиться.

 # Сheck server log for error message
 if [ -n "$(cat $ SERVER _DIR/log/server.log | 
 grep $ERROR_MESSAGE)" ]; then

Тут (выше) собственно и происходит проверка на наличие фразы об ошибке. Команда cat выводит содержимое файла лога, в котором и ищется искомая фраза при помощи утилиты grep.

 # Add record to log file
 echo $CURRENT_DATE >> $RESTARTLOGFILE

Добавляем время запуска скрипта в лог файл.

 # Copy current server log (for the next generation)
 mv $ SERVER _DIR/log/server.log $ 
 SERVER _DIR/log/server-log-$CURRENT_DATE.bak

Копируем лог файл сервера приложений для дальнейшего изучения и перезапускаем сервер.

 # Restart application server
 $SERVER_DIR/START/server restart
 # fi
 fi
 
 ### The end ###

 exit 0

Этот несложный скрипт мы подключили через CRON с периодичностью запуска 3 минуты и дело было сделано. Как показал опыт проблема была решена и наш системный администратор стал спать спокойно от чего сразу же улучшилась рабочая атмосфера в коллективе.

Александр Смелков
Санкт-Петербург Лето 2007