NoneTomcat 6 в CentOS 6: не удается остановить / перезапустить службу

У меня проблема с остановкой и запуском tomcat6 (пакет из репозитория). Я видел несколько коробок CentOS 6 и RHEL 6.

Симптомы таковы, что когда я хочу перезапустить или остановить tomcat6, это просто не удается. Похоже, что это происходит только после того, как оно работает некоторое время. У меня свежая установка CentOS 6, и я смог ее перезапустить, но больше нет.

Вот что я вижу:

 # service tomcat6 restart
 Stopping tomcat6:                                          [FAILED]
 Starting tomcat6:                                          [FAILED]

Когда я пробую /usr/sbin/tomcat6:

# /usr/sbin/tomcat6 stop
/usr/sbin/tomcat6: line 60: /logs/catalina.out: No such file or directory

И выход из /var/log/tomcat6/catalina.out:

Oct 22, 2012 4:53:31 PM org.apache.catalina.startup.Catalina stopServer
SEVERE: Catalina.stop:
java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:327)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:193)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:180)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:384)
    at java.net.Socket.connect(Socket.java:546)
    at java.net.Socket.connect(Socket.java:495)
    at java.net.Socket.<init>(Socket.java:392)
    at java.net.Socket.<init>(Socket.java:206)
    at org.apache.catalina.startup.Catalina.stopServer(Catalina.java:424)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

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

Кстати, я не слишком знаком с tomcat. Ох и: первый пост! Так что будь милым;)

4 ответа

проблема

Проблема со стандартным сценарием выключения Tomcat заключается в том, что он просто недостаточно жесток. Когда вы используете служебные сценарии вашего дистрибутива для остановки Tomcat, вы в конечном итоге просто вызовете собственный сценарий завершения работы Tomcat. CentOS ничем не отличается в этом отношении. По этой причине вам необходимо знать, что скрипт выключения Tomcat может сделать для вас, и самое главное, чего он не делает: он не гарантирует, что Tomcat умрет. Отнюдь не.

Дело в том, что Tomcat довольно легко попадает в какую-то ситуацию, когда его нельзя убить через порт управления... или даже через TERM сигнал.

Давайте рассмотрим, как Tomcat может быть убит в порядке эскалации:

  1. Убить Tomcat через порт управления. Это значение по умолчанию, и именно это пытается выполнить собственный скрипт завершения работы Tomcat. Это не будет работать, если процесс Java завис по той или иной причине. Все сообщения, которые вы видите в Интернете, где люди жалуются, что Tomcat не остановится, более или менее всегда находятся в этом переулке. Это на самом деле не вина Tomcat. Довольно просто создать веб-приложение, которое заставит весь контейнер зависать или его невозможно остановить с помощью этого метода.

  2. Убить Tomcat, отправив процессу Java TERM сигнал. Это более сильный способ уничтожить Tomcat, чем в (1), и собственный скрипт завершения работы Tomcat попытается сделать это, но он будет активирован, только если вы установили CATALINA_PID переменная в вашем Tomcat setenv.sh, (что настоятельно рекомендуется в любом случае). Убить процесс Unix/Linux, отправив ему TERM сигнал по умолчанию для kill Команда из ОС. Это вежливый способ заставить процесс Unix/Linux умереть. К сожалению, даже это в редких случаях не убивает процесс Tomcat.

  3. Убить Tomcat, отправив процессу Java KILL сигнал. (из командной строки ОС это будет kill -9 <pid>). Это всегда убивает процесс и должно быть последним средством. Проблема здесь в том, что стандартный скрипт завершения работы Tomcat никогда не попытается сделать это, даже если метод (1) и (2) завершится неудачно. Поэтому, если вы действительно хотите убедиться, что Tomcat был убит, у вас нет другого выбора, кроме как реализовать собственный скрипт-обертку вокруг собственного скрипта выключения Tomcat.

Если вы запускаете Tomcat в производственной среде, вам действительно нужно подумать, можете ли вы жить в ситуации, когда Tomcat не умирает (или не перезапускается), когда вы запускаете, например, service tomcat restart, Вы можете делать это через cron, и в этом случае вы наверняка ожидаете детерминированного результата, верно?

рекомендации

  • Всегда используйте Tomcat setenv.sh файл, в котором вы определяете CATALINA_PID, Это по крайней мере даст вам метод № 2 выше. для Tomcat setenv.shФайл не существует по умолчанию, поэтому вы должны создать его самостоятельно.

  • Создайте скрипт-оболочку вокруг собственных скриптов Tomcat, который гарантирует, что Tomcat действительно умрет.

В месте, где я работаю, мы реализовали это на всех хостах, которые запускают Tomcat как сервис. Это та же проблема / решение для любого варианта Unix/Linux.

Я столкнулся с этим сегодня. В моем случае причиной был устаревший файл pid.

Tomcat начал хорошо после того, как сделал rm /var/run/tomcat6.pid,

Я столкнулся с той же проблемой. Для меня это произошло из-за проблем с правами доступа / владельцем файла. Когда init.d или же /usr/sbin/tomcat6 Сценарий не может прочитать /etc/tomcat6/tomcat6.conf файл, то значение ${CATALINA_BASE} становится пустым. Так ${CATALINA_BASE}/logs/catalina.out в строке 60 становится /logs/catalina.out,

Я использую Tomcat7 в CentOS; ранее я работал под управлением Tomcat6.

Чтобы перезапустить Tomcat, я всегда просто захожу в каталог bin моей установки Tomcat и запускаю shutdown.sh, затем startup.sh. Вы должны быть в состоянии сделать это как запасной метод.

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