【问题标题】:Grails: Tomcat won't shut down cleanly in prodGrails:Tomcat 不会在 prod 中完全关闭
【发布时间】:2011-04-05 15:48:08
【问题描述】:

我在关闭生产中的 Grails 应用程序时遇到问题。

从 IntelliJ 运行时它会干净地关闭。但是在独立的 Tomcat 7 上,关闭会使其进入僵尸状态,其中 Java 进程仍然存在,但 HTTP 请求挂起。我必须杀死 java 进程(使用 kill)。

我正在使用 Tomcat 的标准 bin/startup.sh 和 shutdown.sh。 Tomcat 停止后,我将 .war 放到 Tomcat 的 /webapps 目录中,然后启动。

我怀疑它可能是 Quartz 作业调度程序插件,但我在 grails-app/jobs 中部署了一个没有作业的版本,它仍然挂起。

以前有人遇到过这个吗?谢谢!

【问题讨论】:

    标签: tomcat deployment grails quartz-scheduler


    【解决方案1】:

    非守护线程

    可能有一个或多个非守护线程仍在运行并阻止 tomcat 成功关闭。

    • 打开终端并输入ps -ef| grep java 并找到您的Tomcat7 p_id
    • 输入kill -3 p_id
    • 类型(在您的 Tomcat 目录中)tail -200 logs/catalina.out
    • 检查kill -3生成的线程转储
    • 寻找非守护线程
    • 检查您的代码以确定该进程为何仍然存在。

    【讨论】:

    • 谢谢,有帮助!看起来另一个 Grails 插件正在启动 OSGI 而不是关闭它。
    【解决方案2】:

    我同意凯雷姆·贝多安的观点。可能有一个不想停止的非守护线程。线程转储是跟踪此问题的好方法。

    我建议使用 VisualVM 连接到您的远程 JVM。对于我收集有关我正在运行的应用程序的信息来说,这是一个非常宝贵的工具。如果您使用的是 Mac,则它已作为操作系统的一部分安装。在终端中,只需键入“jvisualvm”。如果不是在 Mac 上,可以从http://visualvm.java.net/免费下载

    安装后,您可能需要添加一些 JVM 参数以允许远程连接。 http://visualvm.java.net/jmx_connections.html

    截图:

    【讨论】:

    • 如果你不是在 Mac 上,你不需要从 visualvm.java.net 下载 VisualVM。 Java VisualVM 是 JDK 6 update 7 中 JDK 6 的一部分。只需转到 jdk/bin 目录并运行 jvisualvm 或 jvisualvm.exe。
    • 谢谢,德里克。 VisualVM 很酷!但对其他人的警告:我将 Derek 引用的 JMX 属性设置为 JAVA_OPTS,并在尝试关闭 Tomcat 时出现以下错误:java.rmi.server.ExportException:端口已在使用:3333。要修复它,我必须设置JMX 属性为 CATALINA_OPTS 和 not JAVA_OPTS。
    • VisualVM 与 Mac Os X SDK 捆绑在一起,无需下载。
    猜你喜欢
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 2016-12-07
    相关资源
    最近更新 更多