jstack:目标进程没有响应

Tim*_*imo 46 java jstack thread-dump

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

所以,我首先尝试找出哪个PID tomcat使用:

$ jps -l
5809 sun.tools.jps.Jps
Run Code Online (Sandbox Code Playgroud)

但它不在那里?

所以,我用了之后top发现了PID 5730.

然后我调用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
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?:-(

我已经尝试按照Jstack中的描述导出CATALINA_TMPDIR,并且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
Run Code Online (Sandbox Code Playgroud)

更新:

我也试过,sudo -u tomcat6 jstack -l -F 5730 > threaddumpexceptions2.txt但它只给了我很多控制台上的例外.

Tim*_*imo 69

我通过做两件事来完成它:

  1. 将电话改为: sudo -u tomcat6 jstack -J-d64 -m pid
  2. 用Sun的原始sun-6-jdk和sun-6-jre包替换了OpenJDK

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

注意:第2部分可能没有必要.对于一些用户来说,似乎第1部分就足够了.实际上,首先尝试添加sudo命令.它可能已经成功了.

  • 在命令前放置`sudo -u <javaProcUsername>`对我来说是个窍门. (28认同)
  • 顺便说一句 - 只是通过作为同一个用户运行,我发现我消除了这个错误 - 在我的情况下尝试连接你的套件,但我相信同样的原则适用.在Sun JDK与OpenJDK中,或指定64位与32位似乎没有必要修复它. (4认同)
  • 是的,你是最好的:-) (3认同)

小智 31

我认为你需要运行jstack作为运行Tomcat进程的同一个用户.另请注意,jps仅返回当前用户的进程.您可以通过使用sudo运行jps或作为Tomcat进程用户来获取Tomcat进程的pid.

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

  • @valmar:这可能意味着您没有为给定用户(tomcat6)设置shell - 或者最确切地说,您将shell设置为/ bin/false.要解决这个问题,请在root帐户下使用`su -p tomcat6`(这会保留当前的shell). (2认同)