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


113

Як я можу перерахувати всі Java-процеси в bash? Мені потрібен командний рядок. Я знаю, що є команда, psале я не знаю, які параметри мені потрібно використовувати.


1
будь ласка, докладіть трохи більше зусиль для дослідження цього та опису вашої проблеми, є багато можливостей залежно від того, що саме ви хочете.
Мат

3
Якщо ви знаєте, psто спершу спробуйте man ps, info psі дізнайтеся про це в Інтернеті.
ssapkota

Відповіді:



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

27

Починаючи з 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процес?
Toby Speight

4
ps axuwww | grep java | grep -v grep

Викладене вище буде

  • показати всі процеси довгими рядками (arg: www)
  • фільтрувати (grep) лише рядки, що містять слово java, і
  • відфільтруйте рядок "grep java" :)

(btw, цей приклад не є ефективним, але простим для запам'ятовування);)

Ви можете передати вищезазначене іншим командам, наприклад:

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 відповідного класу.


Це те, що я шукав - $ 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дочірні процеси (це був жахливий спосіб багатозадачності, коли світ не знав про теми чи птахи , що за чорт! Що відбувається з 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.