[英]Unable to open socket file: target process not responding or HotSpot VM not loaded
[英]jstack: Target process not responding
我正在運行 Ubuntu 服務器版本,我想對 Tomcat 進行線程轉儲。
所以,我首先試圖找出tomcat使用的PID:
$ 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 中的描述導出 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
更新:
我也試過sudo -u tomcat6 jstack -l -F 5730 > threaddumpexceptions2.txt
但它只在控制台上給了我大量的異常。
我通過做兩件事讓它工作:
sudo -u tomcat6 jstack -J-d64 -m pid
第 1 部分說明:我切換到 64 位模式,使用sudo
並以 Tomcat 用戶身份運行命令。
注意:第 2 部分可能不是必需的。 對於某些用戶來說,似乎第 1 部分就足夠了。 事實上,嘗試先添加sudo
命令。 它可能已經成功了。
我認為您需要以運行 Tomcat 進程的同一用戶身份運行 jstack。 還要注意 jps 只返回當前用戶的進程。 您可以通過使用 sudo 或以 Tomcat 進程用戶身份運行 jps 來獲取 Tomcat 進程的 pid。
此錯誤報告也可能有用:https ://bugs.launchpad.net/ubuntu/+source/sun-java6/+bug/597098
@Valmar,我在這里找到了相同的主題帖子。 無法獲得線程轉儲? 任何想法為什么我的應用程序阻止?
似乎解決方法是sudo -u tomcat6 kill -3 <pid>
。
嘗試切換到進程用戶,然后使用 jstack:
sudo -u {process user} jstack > dump
這也對我有用:
須藤 -u tomcat6 kill -3 pid
看起來什么也沒發生,但是當您查看日志時,堆棧就在那里。 如果您不期望它們,它們看起來像是例外。
我發現使用諸如 'ps -eo pid,user,command | 之類的東西很有用。 grep java' 查找正在使用的實際 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 位的,以“someuser”身份運行。 su 到該用戶並從同一目錄運行 run jstack 等。 (即。/usr/lib/jvm/java/bin/jstack
當您在具有各種不同 Java 安裝/實現的服務器上時很有用。
我遇到了同樣的問題,但以下解決方案都不適合我:
jstack <pid>
jstack -J-d64 -m <pid>
sudo -u <user> jstack ...
我終於將 JDK 從jdk1.6.0_24升級到jdk1.7.0_67並且一切正常。
對於遇到此問題的 Tomcat 用戶,請檢查您的 catalina.out 日志文件。
我遇到了同樣的問題“22693:無法打開套接字文件:目標進程沒有響應或HotSpot VM未加載”。 我放棄了,並試圖找到有關鎖定之前發生的事情的任何信息,但隨后日志文件中出現了 jstack 輸出。
對於那些在被問到這個問題六年后找到這個答案並且他們在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>
我的問題是,我通過終端運行了這個過程。 然后為了測試它的 jstack,我通過ctrl+z
暫停了這個過程。 進程無法響應。 為了解決這個問題,我通過fg
恢復了進程,並通過另一個終端檢查了它的 jstack。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.