在温和使用后,Tomcat会随着AbstractProtocol暂停而随机关闭

运行我的webapp一段时间后(时间因小时和天而异,具体取决于流量)Tomcat似乎随机关闭了自己。 在这种情况发生之前,日志中没有任何exception(没有例外)只是我的应用程序发出的正常INFO内容。

任何人都可以帮助如何最好地调试这个? Tomcat中有什么东西可以触发AbstractProtocol pause信号吗?

日志:

 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

我之前见过这种情况,日志有时候很神秘。 我确实注意到你在80端口运行(这是另一个问题)让我相信你修改了你的server.xml。 如果服务器上有多个tomcat实例,请确保它们都具有唯一的关闭端口。 标准端口是8005,如果多个实例正在同一端口上侦听,则可以将它们都关闭。

您的代码或杠杆库中可能存在随机的System.exit(),或者您在代码中不正确地抑制了真正的错误消息。 我已经多次看到人们在控制器中将其写为error handling的一种forms:

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

这可以防止真正的错误冒泡甚至正确记录。

我也看到tomcat服务器在达到内存限制时就停止运行。 日志中的某处会出现堆空间错误,但出于某种原因,我发现它很容易被埋没,剩下的就是暂停消息。 除了catalina.out之外,查看localhost.log可能是值得的。 那里的垃圾通常较少。

如果您正在使用生产箱或想要快速/临时修复,那么您可能希望将server.xml中的关闭端口设置为“-1”,这将禁用shutdown命令。 这不会让其他可能具有相同关闭端口的应用程序向您的tomcat实例发送关闭信号。 但是使用此设置,您将不得不杀死tomcat而不是关闭它。 这是不好的部分。

我们的tomcat神秘地关闭,因为我们的自定义脚本启动了原始的startup.sh(没有nohup)并继续做一些耗时的事情。 调用自定义脚本的人使用ctrl-Z将其放入后台然后关闭putty终端。 这将SIGHUP发送到连接到终端的所有进程,并且tomcat被关闭。

希望tomcat打印出关于接收SIGHUP的消息。 我们后来发现这个链接证实了我们的分析。

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

当logrotate向Apache进程发送“kill -HUP”并且Apache已经生成Tomcat时,我们遇到了这个问题:Apache会在收到HUP信号时终止所有子进程。