Ответ 1
попробовать:
ps aux | grep java
и посмотрите, как вы попадаете на
Как я могу перечислить все процессы Java в bash?
Мне нужна командная строка. Я знаю, что есть команда ps
, но я не знаю, какие параметры мне нужно использовать.
попробовать:
ps aux | grep java
и посмотрите, как вы попадаете на
Недавняя Java-версия оснащена инструментом "jps" для процесса обработки виртуальной машины Java
http://download.oracle.com/javase/1.5.0/docs/tooldocs/share/jps.html
Например,
[[email protected] 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
Вы можете использовать одиночную команду pgrep (не требует использования труб и нескольких команд):
pgrep -fl java
Начиная с Java 7, самый простой способ и меньше подверженности ошибкам - просто использовать команду jcmd
, которая является частью JDK, чтобы она работала так же на всех ОС.
Пример:
> jcmd
5485 sun.tools.jcmd.JCmd
2125 MyProgram
jcmd
позволяет отправлять запросы диагностической команды на запущенную Java Виртуальная машина (JVM).
Подробнее о как использовать jcmd
.
См. также jcmd
Утилита
Это приведет к возврату всех запущенных java-процессов в среде linux. Затем вы можете убить процесс, используя идентификатор процесса.
ps -e|grep java
Если я хочу просто перечислить java-процессы, используйте:
ps -A | grep java
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" расширяет максимальные символы colum, поэтому можно grep FQN связанного класса.
Чтобы узнать список java, запущенный на машине Linux. ps -e | grep java
Там много способов сделать это. Вы можете использовать java.lang.ProcessBuilder
и "pgrep", чтобы получить идентификатор процесса (PID) с чем-то вроде: pgrep -fl java | awk {'print $1'}
. Или, если вы работаете под Linux, вы можете запросить каталог /proc
.
Я знаю, это кажется ужасным, и не переносимым, и даже плохо реализованным, я согласен. Но поскольку Java фактически работает в VM, по какой-то абсурдной причине, которую я не могу понять после более чем 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
, она сделает трюк. Надеюсь, это помогло, удачи.
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
Альтернативой для окон для отображения всех процессов является:
WMIC path win32_process where "Caption='java.exe'" get ProcessId,Commandline
Но для этого потребуется разбор, чтобы сделать его более понятным.
Я использую это (хорошо на Debian 8):
alias psj='ps --no-headers -ww -C java -o pid,user,start_time,command'
pgrep -l java
ps -ef | grep java
ps aux | grep java
или
$ ps -fea|grep -i java
ps -eaf | grep [j]ava
Это лучше, так как он покажет вам только активные процессы, не включая эту команду, которая также получила строку java. []
выполняет трюк