即使java进程正在运行,jps也不会返回任何输出

即使java进程正在运行,jps也不会返回任何输出,java,debugging,solaris,Java,Debugging,Solaris,我试图在Solaris机器上调试java进程的一些问题,但运行jps不会返回任何输出。jstack给出错误“权限被拒绝”。盒子是由3台相同服务器组成的集群的一部分,JP和jstack在另外2台服务器上工作良好 我从有同样问题但没有答案的人那里找到了以下论坛帖子: 为了澄清运行bps和grep for java正确地给出了所有java过程,但jps没有给出任何东西(匿名使用“程序”和“客户端”来保护罪犯): 我四处询问,从这里我得到的问题是: 12460/2: mkdir("/tmp/hsper

我试图在Solaris机器上调试java进程的一些问题,但运行jps不会返回任何输出。jstack给出错误“权限被拒绝”。盒子是由3台相同服务器组成的集群的一部分,JP和jstack在另外2台服务器上工作良好

我从有同样问题但没有答案的人那里找到了以下论坛帖子:

为了澄清运行bps和grep for java正确地给出了所有java过程,但jps没有给出任何东西(匿名使用“程序”和“客户端”来保护罪犯):

我四处询问,从这里我得到的问题是:

12460/2: mkdir("/tmp/hsperfdata_program", 0755) Err#13 EACCES [ALL]
这意味着jps被拒绝访问psperfdata目录

有人遇到过这个问题并知道如何解决吗?

试试:

jps -J-Djava.io.tmpdir=/app/client/program/tomcat/temp

结果表明,用户没有访问/tmp的权限,因为装载文件系统时出现了一些问题。这会导致hsperfdata_uu中的文件永远不会被写入,即使用户可以访问/tmp/hsperfdata_uu文件夹本身。

请确保您尝试使用jps(顺便说一句,还有jstack)进行“检测”的程序在未设置
java.io.tmpdir
设置或将其设置为系统默认值的情况下运行

Sun Developer网络上有许多bug,这些bug与此相关

故事:Java6Update22使用硬编码的临时目录来放置收集的数据,供jps和jstack使用。jps和jstack计划知道去哪里寻找

然而,因为有人在Java6Update23中提出了一个“bug”,他们“修复”了它,改为使用Java.io.tmpdirJava运行时设置。现在,它默认为特定于系统的位置,即“硬编码”位置。但是如果您在调用java程序时设置了该选项,那么它将使用该选项。结果:JP和jstack看到了他们期望的结果,但什么也没发现

因此,解决方案是确保java.io.tmpdir选项设置为系统默认值(例如,在Mac上:

> java -Djava.io.tmpdir=$TMPDIR javamain
)

当调用程序时。然后jps和jstack会找到它


我的同事格林·诺明顿在他的博客上描述了这一点。Java 6 Update 25中显然有一个补丁。

您是否以运行Java进程的同一用户的身份运行jps?即使您以root用户身份运行jps,它也只会返回该用户运行的进程(在本例中为root用户)。

tldr:
sudo jps
对我有效(因为在其他答案中调用的原因)

,确保启动脚本不包含
-XX:+PerfDisableSharedMem
,因为使用此选项JVM将不会写入任何统计信息,从而使进程对
jps
jstat
不可见


有关详细信息,请参阅。

java进程与我运行jps和jstack的用户相同。bps能够列出流程。询问者的问题不同,但对我来说,这是因为cron job在
/tmp/hsperfdata.*
中删除了超过10天的文件。这导致长时间运行的java进程没有出现在
jps
输出中。看,什么都没变。你为什么这么说?因为jps就是在这里查找
hsperfdata.*
dirs的。
/app/client/program/tomcat/temp
中是否存在任何文件?如果未设置
java.io.tmpdir
,它将在
/tmp
中查找。如果jps找不到hsperfdata目录(或者如果该目录中没有文件),它不会报告任何内容。我可能应该补充一下,您显示的两个java进程的参数包括:
-Djava.io.tmpdir=/app/client/program/tomcat/temp
-Djava.io.tmpdir=/app/clientclone/program/tomcat/temp
。看起来,无论java.io.tmpdir设置为什么,hsperfdata总是放在/tmp中接下来,看起来热点将始终使用操作系统的temp dir来创建hsperfdata dir,但是
jps
将允许您指定
java.io.tempdir
,以防您使用的JVM将这些目录放置在不同的位置。很抱歉有任何困惑。谢谢,特别是Glyn帖子的链接。我非常确定我过去能够在本地看到Tomcat java进程,没有任何问题。+1:我有同样的问题,即/tmp/hsperfdata_uu由用户以外的人拥有;有人把它吃了。我必须将其重新发送给正确的用户,并重新启动流程,以便jps正常工作。询问者的问题不同,但对我来说,这是因为cron job在
/tmp/hsperfdata.*
中删除了超过10天的文件。这导致长时间运行的java进程没有出现在
jps
输出中。请参阅。类似地,在Windows下,将公共权限添加到
C:\Users\userid\AppData\Local\Temp\hsperfdata\u userid
解决了此问题。我在/tmp中安装了一个文件系统,清理并重新启动java进程修复了此问题。谢谢
> java -Djava.io.tmpdir=$TMPDIR javamain