我目前在 Fedora 39 上使用 Eclipse 和 tomcat 9.0.55,几天来一直面临这个问题,当我尝试停止服务器时,它总是卡在“正在停止”。
并且永远处于不确定状态,或者直到我用以下方法杀死它:
pkill -f catalina
,或killall java
作为最后的手段。
即使日志显示作业调度程序已停止,也无法从上下文菜单重新启动或停止。
偶尔会产生错误:
单击“确定”会立即终止服务器。控制台或其他地方没有生成任何日志或跟踪。
我对服务器所做的唯一更改是将启动时间设置为 84600 秒,停止时间设置为 15 秒,关闭模块的自动重新加载(我认为这没有任何原因)。
我根本不知道可能是什么原因造成的,并且没有我知道的日志或跟踪信息。
请注意,这是我的工作笔记本电脑,禁用了包管理器,我不应该绕过或规避它来遵守该策略,因此如果解决方案需要任何额外的包或实用程序,我真的无能为力。
我在这里解决的问题是如何解决这个问题,而不是如何杀死它,我仍然能够杀死它,但这不是非常优雅和/或指定的方式。
Tomcat 的默认关闭超时时间为 3 秒。如果您的应用程序需要更长的时间才能关闭,Tomcat 可能会卡住。您可以尝试通过修改 Tomcat 安装目录中的
server.xml
文件来增加关闭超时时间。
找到
<Server>
元素并添加以下属性:
<Server ... stopTimeout="60">
这会将关闭超时时间增加到 60 秒。您可以根据需要调整该值。
有时,卡住的线程可能会导致 Tomcat 无法正常关闭。您可以尝试启用 Java VisualVM 来捕获和分析线程转储。这可能有助于确定问题的根本原因。
重现问题并关闭 Tomcat 后,您可以分析 VisualVM 记录以识别任何卡住的线程或其他潜在问题。
资源泄漏,例如未关闭的连接或文件句柄,也可能导致 Tomcat 无法正常关闭。您可以尝试通过修改
server.xml
文件来启用 Tomcat 中的泄漏检测和预防功能。
找到
<Server>
元素并添加以下属性:
<Server ... stopAwait="10" stopAttempts="3">
这将指示 Tomcat 在两次关闭尝试之间等待 10 秒,并在放弃之前最多尝试 3 次。
此外,您可以通过在
<Server>
元素内添加以下行来启用泄漏检测和预防功能:
<Server ...>
...
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
...
</Server>
这些侦听器可以帮助识别和防止可能导致关闭问题的资源泄漏。