为什么 jstack 在尝试生成线程转储时无法打开套接字文件?

Why is jstack unable to open socket file when trying to generate a thread dump?

我正在尝试在 AWS 中的 Linux 实例上生成 java 进程 运行 的线程转储。我在 OpenJDK 1.8.0 版上使用 jstack 命令。我 运行ning 的当前命令是 sudo -u <user> jstack -l <java pid> 其中 <user> 是启动 JVM 的用户。

当我运行这个时,我收到错误Unable to open socket file: target process not responding or HotSpot VM not loaded

潜在问题:

在阅读 jstack 的工作原理时,我注意到 jstack 应该生成套接字文件 /tmp/.java_pidXXX 以便附加到进程。此文件未生成。

我的潜在解决方案是,如果我可以生成套接字文件,希望 jstack 能够正确 运行。

我不确定为什么会出现此错误,但我唯一的想法是这可能是在 /tmp 目录中创建文件时出现的某种权限错误。我尝试通过在 /tmp 目录中创建文本文件来测试我的权限,并且我能够创建文本文件。

如何生成这个套接字文件?任何可能的解决方案将不胜感激。

编辑

我在这里添加了用于创建 JVM 的命令。用于获取此命令的命令是 ps -aux | grep java

java -server -Xmx8192m -XX:+HeapDumpOnOutOfMemoryError ->XX:HeapDumpPath="/tmp" -XX:MaxPermSize=256M -Djava.awt.headless=true ->Dsling.run.modes=dynamicmedia_scene7,, <instance_name>,samplecontent,crx3,crx3ta>r -Djava.locale.providers=CLDR,JRE,SPI -jar crx-quickstart/app/cq-?>quickstart-6.5.0-standalone-quickstart.jar start -c crx-quickstart -i >launchpad -p 4502 -Dsling.properties=conf/sling.properties

解法:

为将来遇到此问题的任何人提供的更新。通过更改最初用于启动 JVM 的命令,我找到了适合我的解决方案。我添加了标志 -XX:+StartAttachListener,它强制进程在 JVM 引导期间生成 /tmp/.java_pidXXX 套接字文件。

我在寻找此解决方案的过程中遇到的其他提示:

确保执行 jstack 命令的用户与 运行 您尝试获取其线程转储的进程的用户相同。

此外,请确保套接字文件 /tmp/.java_pidXXX 未被 /tmp 目录中的任何后台清理进程自动清理。