【问题标题】:How to determine what is shutting down my Java app?如何确定是什么关闭了我的 Java 应用程序?
【发布时间】:2020-06-30 21:08:11
【问题描述】:

我有一个在 RHEL 6.10 上运行的 Java8 应用程序。这个应用程序通过通常的方法注册了一个关闭处理程序:

Thread shutdownThread = new Thread(()=>{
   Logger.info("Got shutdown signal");
   // Do cleanup
});
Runtime.getRuntime().addShutdownHook(shutdownThread);

此应用程序由 Jenkins 构建启动(BUILD_ID env var 设置为 dontkillme)。应用程序初始化成功,但在约 30 秒后调用关闭挂钩并终止应用程序。我试图弄清楚是谁在关闭我以及为什么。我已经监视了top,它运行时似乎内存不是问题,所以我不认为OOM 杀手是罪魁祸首。我还查看了/var/log/dmesg/var/log/messages,也没有看到任何相关的内容。我不认为 Jenkins 会杀了我,因为我设置了BUILD_ID,也因为应用程序在“父”Jenkins 作业仍在运行时死亡。

我可以使用哪些其他方法/工具来查看正在发生的事情?请注意,我的环境非常封闭,因此很难从 Internet 下载和运行某些东西,希望我可以使用标准 RHEL6 安装中的某些东西。

【问题讨论】:

  • OOM 杀手也不会调用关闭挂钩。有些东西正在发送信号。
  • 是的,想通了。只是想我会添加它
  • 我不认为 Jenkins 会害死我 通过单独运行您的应用程序来消除 Jenkins 似乎相当容易,即从命令行启动并查看它是否仍然存在关闭。
  • 独立运行成功。但我认为我正在配置一些东西,这样 Jenkins 就不会杀了我(例如,还有其他应用程序启动了该作业,并且它们的寿命超过了父作业)。除非有人知道其他方法来确认詹金斯不是坏人

标签: java jenkins java-8 rhel rhel6


【解决方案1】:

事实证明,该答案对于相关应用程序来说是独一无二的。该应用程序使用 zookeeper-3.5.5 库连接到 Zookeeper 实例。此客户端库对 zookeeper-jute jar 具有运行时依赖关系,当执行目录中不存在该 jar 时,就会出现此问题。

您可能想知道为什么应用程序会默默地自行关闭并且没有抛出 ClassNotFoundException 来帮助我进行调试。好问题!我不知道。

【讨论】:

  • 应用程序不只是在 Java 中自行关闭。 JVM 停止的方式只有几种(用不到一只手的手指)。您的应用程序可能只有一个线程并且 ClassNotFoundException 正在传播回 main 方法并且您正在使用的脚本正在吞噬 I/O,或者您正在捕获异常并调用 System#exit(int),您都不应该这样做首先。无论哪种方式,使用调试器单步执行听起来像是您想要做的,而不是玩猜谜游戏。您的代码仍然存在问题;图书馆与否
猜你喜欢
  • 2016-04-15
  • 1970-01-01
  • 2021-05-17
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
相关资源
最近更新 更多