Tomcat случайным образом отключается с помощью паузы AbstractProtocol после мягкого использования

После запуска моего webapp некоторое время (время меняется в зависимости от количества часов и дней в зависимости от трафика) Tomcat, по-видимому, случайно закрывается. Там нет ничего необычного в журнале, прежде чем это произойдет (без исключений), просто нормальный материал INFO, который испускает мое приложение.

Может ли кто-нибудь помочь в том, как лучше отладить это? Есть ли что-нибудь в Tomcat, которое вызовет сигнал AbstractProtocol pause?

Logs:

09-Nov-2011 21:40:19 org.apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["http-bio-80"]
09-Nov-2011 21:40:20 org.apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["ajp-bio-8009"]
09-Nov-2011 21:40:21 org.apache.catalina.core.StandardService stopInternal
INFO: Stopping service Catalina

Версия Java: 1.6.0_25-b06 Версия Tomcat: 6

Ответы

Ответ 1

Я видел это раньше, и журналы могут быть иногда загадочными. Однако я заметил, что вы работаете на порту 80 (это совсем другая проблема), что оставляет мне поверить, что вы изменили свой server.xml. Если на сервере имеется несколько экземпляров tomcat, все они имеют уникальные порты выключения. Стандартный порт - 8005, и если несколько экземпляров прослушиваются на одном и том же порту, их можно обе снижать.

В вашем коде или в заархивированной библиотеке может быть случайный System.exit(), или вы неправильно подавляете истинное сообщение об ошибке в своем коде. Я видел много раз, что люди пишут это в контроллерах как форму обработки ошибок:

try {
  // Do something
} catch(Exception e) {
  // No rethrowing or logging, just suppressing
}

Это приводит к тому, что истинная ошибка возникает из-за пузыря или даже правильного ведения журнала.

Я также видел, что серверы tomcat просто перестают функционировать, когда они попадают в пределы памяти. Там будет ошибка Heap Space где-то в журналах, но по какой-то причине я считаю, что она может быть похорожена довольно легко, и все, что останется, будет сообщением о паузе. Возможно, стоит посмотреть в localhost.log, кроме того, от catalina.out. Там обычно меньше мусора.

Ответ 2

Наш tomcat загадочно закрылся, потому что наш пользовательский script запустил оригинальный startup.sh(без nohup) и продолжил делать много времени. Лицо, которое вызывало пользовательский script, использовало ctrl-Z, чтобы поместить его в фоновом режиме, а затем закрыть терминал шпатлевки. Это отправило SIGHUP ко всем процессам, подключенным к терминалу, и tomcat получил остановку.

Wish tomcat напечатал сообщение о получении SIGHUP. Позже мы нашли эту ссылку, которая подтвердила наш анализ.

http://solveissue.com/note?id=1767204

Ответ 3

Если вы работаете над производственной коробкой или хотите быстро/временно исправить, вам может потребоваться установить ваш порт выключения в server.xml на "-1", что отключит команду выключения. Это не позволит другим приложениям, которые могут иметь один и тот же порт выключения, отправить сигнал выключения на ваш экземпляр tomcat. Но с этой настройкой вам придется убить вас tomcat, а не закрывать его. Это плохая часть.

Ответ 4

У нас есть эта проблема, когда logrotate отправляет "kill -HUP" в Apache-процесс, а Tomcat был порожден Apache: Apache убьет всех своих детей, когда получит сигнал HUP.