jstack:目标进程无响应

2022-08-31 21:20:04

我正在运行Ubuntu服务器版本,我想采取Tomcat的线程转储。

所以,我首先试图找出哪种PID雄猫使用:

$ jps -l
5809 sun.tools.jps.Jps

但它不在那里吗?

因此,我改用并发现了PID 5730。top

然后我调用jstack来获取线程转储:

$ sudo jstack -l 5730
5730: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding

这是怎么回事?:-(

我已经尝试导出CATALINA_TMPDIR如Jstack中所述,Jstat停止了升级到JDK6u23的工作,但这并没有改变任何东西:

$ export CATALINA_TMPDIR=/tmp
$ sudo /etc/init.d/tomcat6 restart
 * Stopping Tomcat servlet engine tomcat6
   ...done.
 * Starting Tomcat servlet engine tomcat6
   ...done.
$ sudo jstack -l 5934 // new PID after restart
5934: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding

更新:

我也试过,但它只在控制台上给了我大量的异常。sudo -u tomcat6 jstack -l -F 5730 > threaddumpexceptions2.txt


答案 1

我通过做两件事让它工作:

  1. 已将呼叫更改为:sudo -u tomcat6 jstack -J-d64 -m pid
  2. 将 OpenJDK 替换为 Sun 原来的 sun-6-jdk 和 sun-6-jre 软件包

第 1 部分的说明:我切换到64位模式,以Tomcat用户身份使用并运行该命令。sudo

注意:第 2 部分可能不是必需的。对于某些用户来说,第1部分似乎就足够了。实际上,请先尝试仅添加命令。它可能已经做到了这一点。sudo


答案 2

我认为您需要以运行Tomcat进程的同一用户身份运行jstack。另请注意,jps 仅返回当前用户的进程。您可以通过使用 sudo 运行 jps 或以 Tomcat 进程用户的身份获得 Tomcat 进程的 pid。

此 bug 报告也可能很有用:https://bugs.launchpad.net/ubuntu/+source/sun-java6/+bug/597098


推荐