Tomcat 在没有任何日志或任何堆栈的情况下停止

2022-09-02 21:03:54

我们在Tomcat 5.5上遇到了麻烦,它在晚上停止在我们的生产服务器(Linux CentOS 4.8)上,我们不知道为什么它会停止...catalina.out 中没有任何 Tomcat 的日志或任何应用程序的日志。

我们尝试了不同的方法来找出服务器停止的原因:

  • 配置Tomcat以能够生成核心转储
  • 使用javassist的仪器方法,以查找该方法是否被调用System.exit()
  • 将关闭挂钩添加到 JVM(使用Runtime.getRuntime().addShutdownHook())

它们都不起作用,我们没有核心转储,不调用 Exit 方法和关机钩子。我的结论是:

  • VM 未正确终止,但崩溃而不显示任何日志。

任何想法或日志阅读以找到为什么Tomcat停止?


答案 1

1)确保您知道stderr被重定向到哪里,并检查是否有任何内容被打印在那里。

2)检查Tomcat上的内存限制以及系统有多少可用内存。查看 /var/log 下的 Linux 系统日志,查看在此期间是否发生了任何可疑事件。例如,如果系统内存不足,内核可以随机终止进程(几乎)而没有痕迹。

多年来,我们已经在生产中运行了5.5,并且从未发生过任何无法解释的停机,FWIW。


答案 2

这对我有用。

正如其他答案中建议的那样,检查了系统登录,但权限被拒绝。所以,我改用命令,并在日志中得到了这个/var/log/messagesdmesg

“内存不足:杀死进程14606(java)得分106或牺牲孩子”。

在输出中,我还注意到交换内存可用0 K。已运行命令以确认相同。因此,不知何故,内存使用率很高,导致操作系统杀死了我的tomcat进程。top

花了几个小时终于明白了原因。

ps -ef | grep tomcat显示有多个 tomcat 进程正在为同一应用程序运行。似乎,早期的tomcat关闭可能尚未成功完成,并且由于某种原因,即使在关闭后进程也没有被杀死,这导致了高内存使用率。

因此,使用 杀死了所有正在运行的 tomcat 进程。交换内存已释放。kill

再次开始雄猫,工作正常。:)


推荐