如何确定关闭我的 Java 应用程序的原因?

red*_*tom 5 java rhel jenkins java-8 rhel6

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

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

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

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

red*_*tom 0

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

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