Перезагрузитесь, если служба 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, если есть альтернатива.

3 ответа

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

sudo aptitude install monit

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

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 каталог конфигурации, как это:

/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

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

Дело в том, что ваш сервис иногда может зависать, и мониторинг также должен быть в состоянии его догнать. В приведенном ниже простом сценарии мы помещаем запрос состояния 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 максимально простым.

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

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

Другие вопросы по тегам