jstack - 众所周知的文件不安全

Mic*_*jer 42 java jvm jstack

我使用32位Oracle Java 1.6.0在x86_64 CentOS 5.7上运行tomcat 5.5.

tomcat使用的JVM进程有6421 pid.Tomcat工作正常.

运行jstack时失败:

[root@mybox ~]# jstack 6421
6421: well-known file is not secure
Run Code Online (Sandbox Code Playgroud)

要获得任何合理的输出,我需要使用force选项:

[root@mybox ~]# jstack -F 6421
Attaching to process ID 6421, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 17.0-b16
Deadlock Detection:

No deadlocks found.
(...)
Run Code Online (Sandbox Code Playgroud)

问题是:

  1. 错误信息"众所周知的文件不安全"是什么意思?
  2. 什么是"知名"文件?
  3. 如果没有jstack强制选项,该命令何时/何时不起作用?

提前致谢.

Rog*_*sjö 34

这可能是由于/ tmp中的文件用于与具有与jstack获得的权限不同的权限的进程进行通信.有问题的文件是/ tmp/hsperfdata_ $ USER/$ PID.

不知道为什么它与-F一起工作,因为手册页只是说"当'jstack [-l] pid'没有响应时强制进行堆栈转储."

  • 我有同样的问题,因为我与hsperfdata*文件不在同一组中.通过"newgrp other-group"改变我的小组工作. (7认同)
  • @dmachop uid:用于运行`jstack`的gid必须匹配知名文件的uid:gid.以root身份运行不会覆盖检查 - 你可以`sudo -u youruser -g yourgroup jstack ...`成为正确的uid:gid. (3认同)

Eva*_* Y. 23

-F使用时,jvm将被冻结.

如果你能找到的话file: /tmp/hsperfdata_$USER/$PID.只是尝试切换到$USER,然后exec jstack.您正在使用" root " 运行,但该进程可能不属于root.

如果$USER没有登录shell(即守护进程用户),因而无法切换到该用户,可以通过使用来解决这个问题sudo -u $USER jstack $PID

  • 如果$ USER没有登录shell(即守护程序用户),因此无法切换到该用户,则可以使用`sudo -u $ USER jstack $ PID`解决此问题. (10认同)

Fre*_*ger 7

我有这个问题,当我试图运行jstackroot.

一旦我切换到另一个用户,它立即工作.


Mou*_*kir 6

您需要以拥有 java 进程的用户身份运行 jstack 命令:

例如,如果您的 java 应用程序由名为 的用户拥有java-user

sudo -u java-user jstack -l <pid> 
Run Code Online (Sandbox Code Playgroud)