Я запускаю веб-приложение на сервере 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.
Надеюсь, это поможет.