- Статьи и примеры
- | Разное полезное
- | Статья о том, как написать shell script для мониторинга приложения.
Статья о том, как написать shell script для мониторинга приложения.
Постановка задачи
Задача возникла неожиданно. Разработка стороннего производителя – 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