使用 java jstack jmap 等命令工具查看 java 进程信息时,会报错 Unable to open socket file: target process not responding or HotSpot VM not loaded,原因是当前执行命令用户的权限没有对 java 程序启动用户的执行权限。
问题演示:
[demo@Linux ~]# jstack 1
1: 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
解决方法
显示的错误中文意思是 “当前不能打开 socket file,导致不能获取目标进程的回复”。
java 程序启动后,默认(请注意是默认)会在 /tmp/hsperfdata_{user_name}
目录下以该进程的 id 为文件名新建文件,并在该文件中存储 jvm 运行的相关信息,其中的 user_name 为当前的用户名。
[root@java-xxxx-server-775d9485b-66p44 ~]# ls -ltrh /tmp
total 20K
-rw------- 1 root root 0 Nov 13 2020 yum.log
drwxr-xr-x 2 root root 4.0K Aug 20 11:27 hsperfdata_root
上述示例可以看到 tmp
目录下存在 hsperfdata_root
目录,这表示是 root 账号创建的 java 进程,进入该目录会发现存在 java 进程 pid 命名的文件,该文件存放 java 进程运行相关信息,如下:
[root@java-xxxx-server-775d9485b-66p44 hsperfdata_root]# ls -ltrh
total 32K
-rw------- 1 root root 32K Aug 20 20:30 1
问题的本质是当前执行 java 工具命令的用户名和 java 程序启动的用户不一致,导致当前用户打不开如上的文件,我们可以通过 ps -ef | grep java
查看相应 java 程序的启动用户后,切换到对应用户后,再执行即可。