我正在运行Ubuntu服务器版,我想采用Tomcat的线程转储。
所以,我首先尝试找出哪个PID tomcat使用:
$ jps -l
5809 sun.tools.jps.Jps
但它不存在?
所以,我使用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
发生了什么事? : - (
我已按照Jstack and Jstat stopped working with upgrade to JDK6u23中的说明尝试导出CATALINA_TMPDIR,但这并没有改变任何内容:
$ 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
,但它只在控制台上给了我很多例外。
答案 0 :(得分:67)
我通过做两件事来实现它:
sudo -u tomcat6 jstack -J-d64 -m pid
第1部分的说明:我切换到64位模式,使用sudo
并以Tomcat用户身份运行命令。
注意:第2部分可能没有必要。对于一些用户来说,似乎第1部分就足够了。实际上,首先尝试添加sudo
命令。它可能已经成功了。
答案 1 :(得分:30)
我认为你需要运行jstack作为运行Tomcat进程的同一个用户。另请注意,jps仅返回当前用户的进程。您可以通过使用sudo运行jps或作为Tomcat进程用户来获取Tomcat进程的pid。
此错误报告也可能有用:https://bugs.launchpad.net/ubuntu/+source/sun-java6/+bug/597098
答案 2 :(得分:4)
@Valmar,我在这里找到相同的主题。 Unable to get thread dump? Any ideas why my app blocks?
似乎解决方法是sudo -u tomcat6 kill -3 <pid>
。
答案 3 :(得分:1)
这对我也很有用:
sudo -u tomcat6 kill -3 pid
看起来没有任何反应,但是当您查看日志时,堆栈就在那里。如果您不期待它们,它们看起来就像例外。
答案 4 :(得分:1)
我觉得使用类似&#39; ps -eo pid,user,command |这样的东西很有用grep java&#39;找到正在使用的实际java命令,然后使用该目录查找匹配的jstack等。
# ps -eo user,command | grep '[j]ava' | cut -d' ' -f1
someuser /usr/lib/jvm/java/bin/java
# /usr/lib/jvm/java/bin/java -version
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)
所以它的64位,运行为&#39; someuser&#39;。 su到该用户并从同一目录运行jstack等。 (即/ usr / lib / jvm / java / bin / jstack
当您在具有各种不同Java安装/实现的服务器上时非常有用。
答案 5 :(得分:1)
尝试切换到流程用户,然后使用jstack:
sudo -u {process user} jstack&gt;转储
答案 6 :(得分:0)
我遇到了同样的问题,但以下解决方案的 none 对我有用:
jstack <pid>
jstack -J-d64 -m <pid>
sudo -u <user> jstack ...
我最终将JDK从 jdk1.6.0_24 升级到 jdk1.7.0_67 ,并且一切正常。
答案 7 :(得分:0)
对于遇到此问题的Tomcat用户,请检查catalina.out日志文件。
我遇到了同样的问题&#34; 22693:无法打开套接字文件:目标进程没有响应或HotSpot VM未加载&#34;。我放弃了,并试图找到任何关于它被锁定之前发生的事情,但随后在日志文件中有jstack输出。
答案 8 :(得分:0)
对于那些在被问及 CentOS 7 六年后发现这个答案的人,请注意SELinux会阻止jmap编写堆转储,因为开箱即用,它将拒绝写入套接字,除非该目录具有类型tomcat_tmp_t
。
就我而言,我在/usr/share/tomcat/.jmap
下编写了我的堆转储。该目录由我的运行时用户拥有。
因此,允许jmap写入此目录:
semanage fcontext -a -t tomcat_tmp_t "/usr/share/tomcat/.jmap(/.*)?"
restorecon /usr/share/tomcat -vR
这使我们可以像我们的tomcat用户一样运行:
jmap -dump:format=b,file=/usr/share/tomcat/.jmap/tomcat-`date +%s`.bin <pid>
答案 9 :(得分:0)
我的问题是,我在终端上运行了该进程。然后,为了测试其jstack,我以ctrl+z
暂停了该过程。该过程无法响应。为了解决此问题,我通过fg
恢复了该过程,并通过另一个终端检查了它的jstack。