Jps не возвращает выход даже при запуске java-процессов
Я пытаюсь отладить некоторые проблемы с java-процессами в окне Solaris, но запуск jps не приводит к выходу. И jstack дает ошибку "Permission denied". Ящик является частью кластера из 3 одинаковых серверов, jps и jstack работают на двух других серверах.
Я нашел следующее сообщение на форуме от кого-то с той же проблемой, но не ответил:
http://forums.sun.com/thread.jspa?threadID=5422237
Чтобы уточнить, что работает bps и grep для 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.
Кто-нибудь сталкивается с этой проблемой и знает, как ее решить?
Ответы
Ответ 1
Оказывается, у пользователя не было доступа к /tmp из-за некоторой проблемы с монтированием файловой системы. Это приводит к тому, что файлы внутри hsperfdata_ никогда не записываются, хотя пользователь имел доступ к самой папке/tmp/hsperfdata_.
Ответ 2
Убедитесь, что программа, которую вы пытаетесь "обнаружить" с помощью jps (и jstack, кстати), запускается без установки параметра java.io.tmpdir
или установки его по умолчанию для системы.
В Sun Developer Network существует ряд ошибок временные адреса temp не должны быть жестко закодированы, Исправить для 6938627 breaks visualvm мониторинг, когда -Djava.io.tmpdir и Сделать временное свойство использования каталога 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 найдут его.
Мой коллега Глин Нормингтон описывает это на blog. По-видимому, исправление в Java 6 Update 25.
Ответ 3
TL;DR: sudo jps
работал у меня (по причинам, указанным в других ответах)
Ответ 4
Try:
jps -J-Djava.io.tmpdir=/app/client/program/tomcat/temp
Ответ 5
Вы используете jps как тот же самый пользователь, который запускает процессы Java? Даже если вы запустите jps как root, он вернет только процессы, выполняемые этим пользователем (в этом случае root).
Ответ 6
Кроме того, убедитесь, что ваш запуск script содержит не -XX:+PerfDisableSharedMem
, потому что с помощью этой опции JVM не будет писать никаких статистических данных, делая процесс невидимым для jps
и jstat
.
Подробнее см. https://support.datastax.com/hc/en-us/articles/208269876-Java-utilities-such-as-jps-or-jstat-unable-to-monitor-DSE-processes.