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