我们遇到Tomcat 5.5的问题,它在我们的生产服务器(Linux CentOS 4.8)上晚上停止,我们不知道为什么它会停止... 没有Tomcat登录catalina.out或任何应用程序的日志。
我们尝试了不同的方法来找到服务器停止的原因:
System.exit()
方法来查找方法是否被调用Runtime.getRuntime().addShutdownHook()
)它们都没有工作,我们没有核心转储,没有调用Exit方法和关闭钩子。 我的结论是:
任何想法或日志阅读以找出Tomcat停止的原因?
答案 0 :(得分:23)
1)确保你知道stderr被重定向的位置并检查是否有任何打印在那里。
2)检查Tomcat的内存限制以及系统有多少可用内存。查看/ var / log下的Linux系统日志,查看在此期间是否发生了任何可疑事件。例如,如果系统内存不足,内核可以随机杀死一个进程(几乎没有跟踪)。
我们已经在生产中运行了5.5年,从未有任何无法解释的停机,FWIW。
答案 1 :(得分:3)
这对我有用。
如此处其他答案所示,已检查系统登录/var/log/messages
,但拒绝了我的权限。因此,我改用dmesg
命令并将其保存在日志中
“内存不足:杀死进程14606(java)得分106或牺牲孩子”。
在输出中,我还注意到可用内存交换0 K 。运行top
命令以确认相同。因此,由于某种原因内存占用率很高,导致操作系统终止了我的tomcat进程。
花了几个小时终于找到了原因。
ps -ef | grep tomcat
表明,同一应用程序正在运行多个tomcat进程。看来,早期的tomcat关闭可能未成功完成,并且由于某种原因,即使在关闭后,进程也没有被终止,这导致了较高的内存使用率。
因此,请使用kill
杀死所有正在运行的tomcat进程。 SWAP内存已释放。
再次启动tomcat,效果很好。 :)
答案 2 :(得分:0)
最有可能是堆栈溢出异常。这是Tomcat发生时的典型行为。例如,您正在尝试序列化为具有循环依赖性的JSON或XML bean(但不处理循环)。
每次我遇到这个问题(好几次)都是这个问题。所有其他停靠点通常都会正确记录(如OutOfMemory等)。
这种类型的停留不会留下任何痕迹。
答案 3 :(得分:0)
Tomcat 7在catalina中有一个选项来阻止System.exit类调用或类似的东西:http://ci.apache.org/projects/tomcat/tomcat7/docs/security-manager-howto.html。
也许5.5版本有类似的选项。试试文档。
可以选择将输出重定向到用于启动Tomcat的同一控制台。当您在基于Unix的系统上执行时,此信息将重定向到日志,在Windows上,如果未重定向,它将保留在控制台中。