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 может быть убит в порядке эскалации:
Убить Tomcat через порт управления. Это значение по умолчанию, и именно это пытается выполнить собственный скрипт завершения работы Tomcat. Это не будет работать, если процесс Java завис по той или иной причине. Все сообщения, которые вы видите в Интернете, где люди жалуются, что Tomcat не остановится, более или менее всегда находятся в этом переулке. Это на самом деле не вина Tomcat. Довольно просто создать веб-приложение, которое заставит весь контейнер зависать или его невозможно остановить с помощью этого метода.
Убить Tomcat, отправив процессу Java
TERM
сигнал. Это более сильный способ уничтожить Tomcat, чем в (1), и собственный скрипт завершения работы Tomcat попытается сделать это, но он будет активирован, только если вы установилиCATALINA_PID
переменная в вашем Tomcatsetenv.sh
, (что настоятельно рекомендуется в любом случае). Убить процесс Unix/Linux, отправив емуTERM
сигнал по умолчанию дляkill
Команда из ОС. Это вежливый способ заставить процесс Unix/Linux умереть. К сожалению, даже это в редких случаях не убивает процесс Tomcat.Убить Tomcat, отправив процессу Java
KILL
сигнал. (из командной строки ОС это будетkill -9 <pid>
). Это всегда убивает процесс и должно быть последним средством. Проблема здесь в том, что стандартный скрипт завершения работы Tomcat никогда не попытается сделать это, даже если метод (1) и (2) завершится неудачно. Поэтому, если вы действительно хотите убедиться, что Tomcat был убит, у вас нет другого выбора, кроме как реализовать собственный скрипт-обертку вокруг собственного скрипта выключения Tomcat.
Если вы запускаете Tomcat в производственной среде, вам действительно нужно подумать, можете ли вы жить в ситуации, когда Tomcat не умирает (или не перезапускается), когда вы запускаете, например, service tomcat restart
, Вы можете делать это через cron, и в этом случае вы наверняка ожидаете детерминированного результата, верно?
рекомендации
Всегда используйте Tomcat
setenv.sh
файл, в котором вы определяетеCATALINA_PID
, Это по крайней мере даст вам метод № 2 выше. для Tomcatsetenv.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. Вы должны быть в состоянии сделать это как запасной метод.