Назад | Перейти на главную страницу

Перезагрузитесь, если служба tomcat7 не отвечает

Я запускаю веб-приложение на сервере Tomcat. В коде сервера есть трудно обнаруживаемая проблема, которая приводит к сбою один или два раза каждый день. Я постараюсь исправить это, когда у меня будет время. Но до этого дня в проблемном случае перезапуск tomcat (/etc/init.d/tomcat7 restart) или в основном перезагрузка машины также казались довольно хорошими решениями на данный момент. Я хочу обнаружить живость сервера с помощью wget вместо grep или чего-то еще, потому что, хотя tomcat запускает мою службу, я не работаю.

wget localhost:8080/MyService/

выходы

--2012-12-04 14:10:20--  http://localhost:8080/MyService/
Resolving localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:8080... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2777 (2.7K) [text/html]
Saving to: “index.html.3”

100%[======================================>] 2,777       --.-K/s   in 0s

2012-12-04 14:10:20 (223 MB/s) - “index.html.3” saved [2777/2777]

когда моя служба закончится. И выходы

Resolving localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:8080... failed: Connection refused.

или просто застревает после того, как сказал

--2012-12-04 14:07:34--  http://localhost:8080/MyService/
Resolving localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:8080... connected.
HTTP request sent, awaiting response...

Можете ли вы предложить мне сценарий оболочки с заданием cron или что-то еще для этого. Я предпочитаю не использовать cron, если есть альтернатива.

Вместо того, чтобы писать сценарии с нуля, я настоятельно рекомендую использовать Монит. я нашел эта страница который дает вам некоторые основы, но я считаю, что реализация здесь немного небрежна. Так что позвольте мне уладить это. Это объяснит, как установить monit в Ubuntu 12.04. Сначала установите monit из репозитория вот так:

sudo aptitude install monit

Затем вы хотите изменить настройки почтового сервера, чтобы вы могли получать уведомления по электронной почте. Просто откройте monit config вот так:

sudo nano /etc/monit/monitrc

Теперь найдите область с настройками почтового сервера и вставьте эту строку:

set mailserver localhost

Это набор правил, который я использую для Apache. Сначала создайте файл конфигурации:

sudo nano /etc/monit/conf.d/apache2.conf

check process apache with pidfile /var/run/apache2.pid
        start "/etc/init.d/apache2 start"
        stop  "/etc/init.d/apache2 stop"
        if failed host 127.0.0.1 port 80
                with timeout 15 seconds
        then restart
        if loadavg (1min) greater than 7
                for 5 cycles
        then restart
        alert my_email@server.host only on { timeout, nonexist, resource }

Затем перезапустите monit вот так:

sudo service monit restart

Этот набор правил проверяет порт 80 на локальном адресе 127.0.0.1 и если истекает 15-секундный тайм-аут, служба Apache перезапускается. У меня также есть подключенное к нему правило средней нагрузки, которое будет проверять нагрузку каждую минуту, и если она выше 7 в течение 5 циклов подряд, оно перезапустит apache служба.

Для Tomcat адаптация правила на этой странице- как упоминалось выше - будет выглядеть так. Сначала откройте файл для редактирования в monit config, как это:

/etc/monit.d/tomcat 

И поместите в него этот набор правил:

check host tomcat with address localhost
            stop program = "/etc/init.d/tomcat stop"
            start program = "/etc/init.d/tomcat restart"
            if failed port 8080 and protocol http
            then start
            alert my_email@server.host only on { start, nonexist }

Затем перезапустите monit вот так для этих новых правил:

sudo service monit restart

Я бы перепроверил { start, nonexist } как я сейчас только предполагаю, так как у меня нет настройки Tomcat для тестирования. Но это должно быть хорошо.

Вы можете следить за monit войти здесь:

sudo tail -f -n 200 /var/log/monit.log

Монит - хороший инструмент для этого. Он будет контролировать службы или статус сервера, например Кот (или место на жестком диске и т. д.), и он перезапустит их, отправит вам электронное письмо и т. д. в соответствии с тем, что вы поместили в файл конфигурации, будучи более мощным и гибким, чем сценарий Bash (который вы можете предпочесть для простоты).

Я надеюсь, что вы уже нашли основную причину своей проблемы и смогли ее исправить. Если вам или кому-то еще понадобится решение для этого, вот попытка ответа.

Дело в том, что ваш сервис иногда может «зависнуть», и мониторинг тоже должен его догнать. В приведенном ниже простом скрипте мы помещаем запрос статуса wget в фоновый режим, ждем несколько секунд и, если он не смог получить статус 200 из службы, перезапустим его.

#!/bin/sh
# WARNING, UNTESTED CODE !

TMPFILE=`mktemp`
WAITTIME=15

# Run the test
wget localhost:8080/MyService/ -o $TMPFILE &
WGETPID=$!

# Wait few seconds and let the test finish
sleep $WAITTIME

if [ ! `grep "HTTP request sent" $TMPFILE |grep "200 OK"|wc -l` -gt 0 ]; then
    echo "The service did not return 200 in $WAITTIME seconds."
    echo "Restarting it."
    /etc/init.d/tomcat7 restart
fi

# Cleanup
rm $TMPFILE
kill $WGETPID

Для планирования я очень рекомендую cron для простоты. Другой вариант - запустить это как демон, что внесет ненужную сложность, ИМХО. Также можно использовать какой-нибудь другой (внешний) планировщик, но я предпочитаю cron.

Надеюсь, это поможет.