Как я могу перечислить все процессы Java в bash? Мне нужна командная строка. Я знаю, что есть команда, ps
но не знаю, какие параметры мне нужно использовать.
ps
то сначала попробуйте man ps
, info ps
и узнайте об этом в Интернете.
Как я могу перечислить все процессы Java в bash? Мне нужна командная строка. Я знаю, что есть команда, ps
но не знаю, какие параметры мне нужно использовать.
ps
то сначала попробуйте man ps
, info ps
и узнайте об этом в Интернете.
Ответы:
Последняя версия 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
jps -lV
очень полезно. Выводит только pid и квалифицированное имя основного класса:
2472 com.intellij.idea.Main
11111 sun.tools.jps.Jps
9030 play.server.Server
2752 org.jetbrains.idea.maven.server.RemoteMavenServer
Начиная с Java 7 , самый простой и менее подверженный ошибкам способ - просто использовать команду, jcmd
которая является частью JDK , чтобы она работала одинаково во всех ОС.
Пример:
> jcmd
5485 sun.tools.jcmd.JCmd
2125 MyProgram
jcmd
позволяет отправлять запросы диагностических команд на работающую виртуальную машину Java (JVM).
Подробнее о том, как пользоватьсяjcmd
.
jps
Для лучшего формата вывода проверьте эту команду:
ps -fC java
Это вернет все запущенные java-процессы в среде Linux. Затем вы можете убить процесс, используя идентификатор процесса.
ps -e|grep java
ps aux | grep java
или
$ ps -fea|grep -i java
Если я хочу просто перечислить java-процессы, используйте:
ps -A | grep java
pgrep -l java
ps -ef | grep java
grep
процесс?
ps axuwww | grep java | grep -v grep
Вышеуказанное будет
(кстати, этот пример не самый эффективный, но его легко запомнить);)
вы можете передать указанное выше другим командам, например:
ps axuwww | grep java | grep -v grep | sed '.....' | while read something
do
something_another $something
done
и т.д...
Когда я хочу узнать, выполняется ли определенный класс Java, я использую следующую командную строку:
ps ww -f -C java | grep "fully.qualified.name.of.class"
Со стороны ОС имя команды процесса - «java». Параметр «ww» расширяет максимальное количество символов в столбце, поэтому можно найти FQN соответствующего класса с помощью grep.
$ top
просто выдает «java» в качестве команды, что не так уж и полезно при попытке выяснить, какой процесс загружает процессор. $ ps ww -fC java
предоставляет недостающие части головоломки.
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
Но это потребует некоторого анализа, чтобы сделать его более разборчивым.
Есть много способов сделать это. Вы можете использовать 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
, она сделает свое дело. Надеюсь, это помогло, удачи.
ps -eaf | grep [j]ava
Это лучше, так как он покажет вам только активные процессы, не включая эту команду, которая также имеет строку java, []
которая делает трюк
Я использую это (хорошо в Debian 8):
alias psj='ps --no-headers -ww -C java -o pid,user,start_time,command'
Чтобы узнать список Java, запущенных на Linux-машине. ps -e | grep java