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

时间:2010-09-27 15:35:20

标签: java debugging solaris

我正在尝试在Solaris机器上调试java进程的一些问题,但是运行jps不会返回任何输出。并且jstack给出错误'Permission denied'。该盒子是3个相同服务器集群的一部分,jps和jstack在其他2台服务器上运行良好。

我发现以下论坛帖子来自有同样问题但没有答案的人: http://forums.sun.com/thread.jspa?threadID=5422237

澄清运行bps和grep for java会正确地给出所有java程序,但是jps没有给出任何东西(用'program'和'client'匿名来保护有罪者):

program @ clientdelivery2 : ~/
-> bps auxww|grep java
program     3427  5.5 54.067742726649544 ?        S   Sep 25 1039:47 /usr/jdk/instances/jdk1.6.0_16/bin/amd64/java -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=/app/client/program/tomcat/conf/logging.properties -Xmx6144m -XX:PermSize=128m -XX:MaxPermSize=512m -Djava.endorsed.dirs=/app/client/program/tomcat/endorsed -classpath :/app/client/program/tomcat/bin/bootstrap.jar -Dcatalina.base=/app/client/program/tomcat -Dcatalina.home=/app/client/program/tomcat -Djava.io.tmpdir=/app/client/program/tomcat/temp org.apache.catalina.startup.Bootstrap start
program    29915  0.1 11.915252441467896 ?        S 14:55:28  3:59 /usr/jdk/instances/jdk1.6.0_16/bin/amd64/java -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=/app/clientclone/program/tomcat/conf/logging.properties -Xmx2g -XX:PermSize=128m -XX:MaxPermSize=512m -Dcom.sun.management.jmxremote -Djava.endorsed.dirs=/app/clientclone/program/tomcat/endorsed -classpath :/app/clientclone/program/tomcat/bin/bootstrap.jar -Dcatalina.base=/app/clientclone/program/tomcat -Dcatalina.home=/app/clientclone/program/tomcat -Djava.io.tmpdir=/app/clientclone/program/tomcat/temp org.apache.catalina.startup.Bootstrap start
program     1573  0.0  0.0 4760 1332 pts/5    S 17:05:24  0:00 grep --colour java

program @ clientdelivery2 : ~/
-> jps

program @ clientdelivery2 : ~/
->

我四处询问http://forums.oracle.com/forums/message.jspa?messageID=5408592我的问题是:

12460/2: mkdir("/tmp/hsperfdata_program", 0755) Err#13 EACCES [ALL]

意味着jps被拒绝访问psperfdata目录。

是否有人遇到此问题并知道如何解决?

6 个答案:

答案 0 :(得分:15)

由于安装文件系统的某些问题,用户无法访问/ tmp。这导致hsperfdata_中的文件永远不会被写入,即使用户可以访问/ tmp / hsperfdata_文件夹本身。

答案 1 :(得分:6)

确保您尝试使用jps(和jstack,偶然)“检测”的程序在未设置java.io.tmpdir设置或将其设置为系统默认设置的情况下运行。

Sun Developer Network temp dir locations should not be hardcodedFix for 6938627 breaks visualvm monitoring when -Djava.io.tmpdirMake temporary directory use property java.io.tmpdir上存在许多与此相关的错误。

故事:java Java 6 Update 22曾经使用硬编码的临时目录来存储为jps和jstack使用而收集的数据。 jps和jstack程序知道在哪里看。

但是,因为有人在Java 6 Update 23中引发了一个“错误”,所以他们“修复”了它以使用java.io.tmpdir java运行时设置。现在,这默认为系统特定的位置,这就是“硬编码”的位置。但是如果在调用java程序时设置了该选项,那么它将使用它。结果:jps和jstack看起来就像他们期望的那样,并且找不到任何东西。

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

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

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

我的同事Glyn Normington在blog上描述了这一点。 Java 6 Update 25中显然有一个修复。

答案 2 :(得分:6)

tldr:sudo jps为我工作(出于其他答案中提到的原因)

答案 3 :(得分:2)

尝试:

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

此外,请确保您的启动脚本包含-XX:+PerfDisableSharedMem,因为使用此选项时,JVM不会写入任何统计信息,从而使该进程对jps和{jstat不可见{1}}。

有关详细信息,请参阅https://support.datastax.com/hc/en-us/articles/208269876-Java-utilities-such-as-jps-or-jstat-unable-to-monitor-DSE-processes

相关问题