【发布时间】:2012-07-05 11:13:36
【问题描述】:
我的情况是这样的:
每次上传war文件到web-app文件夹之前,我都会调用sh shutdown.sh来停止Tomcat。过去,完全关机大约需要 30 秒。但是现在已经不行了。
实际上,它做了一些工作,因为当我从网页访问应用程序时,它会抛出 503 错误(维护中)。但是当我使用ps aux | grep tomcat查看时,tomcat进程还在。它会在那里大约 5 - 10 分钟。
我知道完成所有任务可能需要额外的时间,但是在完全停止之前它太慢了(5 - 10 分钟)。我不明白为什么会发生这种情况,但一定有一些原因。也许与代码或我们最近使用的新部署脚本有关。我几乎不知道在哪里检查。
这对我们的团队很重要,因为我们正在使用“自动部署”,其中我们使用脚本自动打包 war 文件,在特定时间上传和部署。如果我们在旧的tomcat实例成功关闭之前启动了一个新的tomcat实例,它将永远挂在那里,并且通过“kill -9”清理任务是令人生畏的。
有没有人尝试过这个问题?任何线索将不胜感激。
【问题讨论】:
-
问:那么在这 5 到 10 分钟内,日志中的最后一件事是什么?另外:“ps -eaf”是否为您提供任何线索(或者您是否只看到 CPU 利用率为零的 Java 进程)?你的 Tomcat 版本是多少?你的操作系统?另外:如果你在“ps”中识别出一个“java”进程“挂起”,你应该得到一个堆栈跟踪:wiki.apache.org/tomcat/…
-
@paulsm4:查看日志,我发现即使调用了shutdown.sh,我的Quartz 作业仍然运行。过了一会儿,抛出一个错误:严重:Web 应用程序 [/project] 似乎已经启动了一个名为 [Resource Destroyer in BasicResourcePool.close()] 的线程,但未能停止它。这很可能会造成内存泄漏。
-
@paulsm4:顺便说一下,我让石英作业一次运行大约 10 秒。这可能是个问题吗?
-
看看这里的答案。 stackoverflow.com/questions/5554647/… Tomcat 将等待所有非守护线程完成后再关闭。链接中的答案将告诉您如何确定仍在运行的内容
-
@Sean:谢谢。我去看看。
标签: java linux apache tomcat tomcat6