Список процессов Java


113

Как я могу перечислить все процессы Java в bash? Мне нужна командная строка. Я знаю, что есть команда, psно не знаю, какие параметры мне нужно использовать.


1
пожалуйста, приложите немного больше усилий для исследования этого и описания вашей проблемы, есть много возможностей в зависимости от того, что именно вам нужно.
Мат

3
Если вы знаете, что есть, psто сначала попробуйте man ps, info psи узнайте об этом в Интернете.
ssapkota 08

Ответы:



109

Последняя версия Java поставляется с инструментом состояния процесса виртуальной машины Java "jps"

http://download.oracle.com/javase/1.5.0/docs/tooldocs/share/jps.html

Например,

[nsushkin@fulton support]$ jps -m
2120 Main --userdir /home/nsushkin/.netbeans/7.0 --branding nb
26546 charles.jar
17600 Jps -m

2
Просто примечание: jps поставляется только с JDK, но не с JRE. На машинах с простыми средами выполнения Java не будет этого инструмента.
aguazales

как я могу получить только количество запущенных java-процессов?
Jet

50
jps -lV

очень полезно. Выводит только pid и квалифицированное имя основного класса:

2472 com.intellij.idea.Main
11111 sun.tools.jps.Jps
9030 play.server.Server
2752 org.jetbrains.idea.maven.server.RemoteMavenServer

31

Вы также можете использовать одну команду pgrep (не требует использования каналов и нескольких команд):

pgrep -fl java

28

Начиная с Java 7 , самый простой и менее подверженный ошибкам способ - просто использовать команду, jcmd которая является частью JDK , чтобы она работала одинаково во всех ОС.

Пример:

> jcmd
5485 sun.tools.jcmd.JCmd
2125 MyProgram

jcmd позволяет отправлять запросы диагностических команд на работающую виртуальную машину Java (JVM).

Подробнее о том, как пользоватьсяjcmd .

Смотрите также Utilityjcmd


1
Вау, это даже лучше, чемjps
Шридхар Сарнобат


12

Это вернет все запущенные java-процессы в среде Linux. Затем вы можете убить процесс, используя идентификатор процесса.

ps -e|grep java


6

Если я хочу просто перечислить java-процессы, используйте:

ps -A | grep java

5
pgrep -l java
ps -ef | grep java

5
Благодарим вас за этот фрагмент кода, который может оказать немедленную помощь. Правильное объяснение значительно повысило бы его образовательную ценность, показав, почему это хорошее решение проблемы, и сделало бы его более полезным для будущих читателей с похожими, но не идентичными вопросами. Пожалуйста , измените свой ответ , чтобы добавить объяснение, и дать указание о том , что применять ограничения и допущения. В частности, почему второй из них не показывает grepпроцесс?
Тоби Спейт

4
ps axuwww | grep java | grep -v grep

Вышеуказанное будет

  • показать вам все процессы с длинными строками (arg: www)
  • фильтровать (grep) только строки, содержащие слово java, и
  • отфильтровать строку "grep java" :)

(кстати, этот пример не самый эффективный, но его легко запомнить);)

вы можете передать указанное выше другим командам, например:

ps axuwww | grep java | grep -v grep | sed '.....'  | while read something
do
    something_another $something
done

и т.д...


3

Когда я хочу узнать, выполняется ли определенный класс Java, я использую следующую командную строку:

ps ww -f -C java | grep "fully.qualified.name.of.class"

Со стороны ОС имя команды процесса - «java». Параметр «ww» расширяет максимальное количество символов в столбце, поэтому можно найти FQN соответствующего класса с помощью grep.


Это то, что я искал - $ topпросто выдает «java» в качестве команды, что не так уж и полезно при попытке выяснить, какой процесс загружает процессор. $ ps ww -fC javaпредоставляет недостающие части головоломки.
Дэвид Кларк

2

jps & jcmd не показывал мне никаких результатов, когда я пробовал использовать openjdk-1.8 в redhat linux. Но даже если он это сделал, он показывает только процессы под текущим пользователем, что не работает в моем случае. В итоге я использовал ps | grep, но путь к классам для некоторых java-приложений может быть очень длинным, что делает результаты неразборчивыми, поэтому я использовал sed для его удаления. Это все еще немного грубо, но удаляет все, кроме: PID, User, java-class / jar, args.

ps -o pid,user,cmd -C java | sed -e 's/\([0-9]\+ *[^ ]*\) *[^ ]* *\([^$]*\)/\1 \2/' -e 's/-c[^ ]* [^ ]* \|-[^ ]* //g'

Результаты выглядят примерно так:

  PID USER     CMD
11251 userb org.apache.zookeeper.server.quorum.QuorumPeerMain ../config/zookeeper.properties
19574 userb com.intellij.idea.Main
28807 root org.apache.nifi.bootstrap.RunNiFi run
28829 root org.apache.nifi.NiFi

Альтернативой в Windows для перечисления всех процессов является:

WMIC path win32_process where "Caption='java.exe'" get ProcessId,Commandline

Но это потребует некоторого анализа, чтобы сделать его более разборчивым.


1

Есть много способов сделать это. Вы можете использовать java.lang.ProcessBuilderи «pgrep» , чтобы получить идентификатор процесса (PID) с чем - то вроде: pgrep -fl java | awk {'print $1'}. Или, если вы работаете под Linux, вы можете запросить /procкаталог.

Я знаю, это кажется ужасным, непереносимым и даже плохо реализованным, согласен. Но поскольку Java на самом деле работает в виртуальной машине, по какой-то абсурдной причине, которую я не могу понять после более чем 15 лет работы с JDK, поэтому невозможно увидеть вещи за пределами пространства JVM, с вами это действительно смешно подумай об этом. Вы можете делать все остальное, даже forkи joinдочерние процессы (те были ужасным способом многозадачности , когда мир не знал о нитях или Pthreads , что такая ад! Что происходит в на с Java ?! :).

Я знаю, что это приведет к обширному обсуждению, но в любом случае есть очень хороший API, который я уже использовал в своих проектах, и он достаточно стабилен ( это OSS, поэтому вам все равно нужно стресс-тестировать каждую используемую версию, прежде чем действительно доверять API ): https : //github.com/jezhumble/javasysmon

JavaDoc: http://jezhumble.github.io/javasysmon/ , найдите класс com.jezhumble.javasysmon.OsProcess, она сделает свое дело. Надеюсь, это помогло, удачи.


1
 ps -eaf | grep [j]ava

Это лучше, так как он покажет вам только активные процессы, не включая эту команду, которая также имеет строку java, []которая делает трюк


это должно быть ps -eaf | grep Java not [j] ava
vaquar khan

@vaquarkhan, чувак, просто попробуй запустить и твои, и мои предложения и посмотри, в чем разница, они оба будут работать
Илья Газман

Оба дают одинаковые результаты, однако [j] ava сбивает с толку
vaquar khan


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.