Як я можу дізнатись, які jar-файли Java зараз (та їх PID)?


12

У мене є .jarфайл, який відомий для несправностей. При виникненні несправності допомагає лише перезапуск. У мене є спосіб виявити ці несправності (читаючи лог-файл зазначеного .jar). Тому я хочу написати сценарій, який вбиває процес кожного разу, коли виникла несправність. Проблема полягає в наступному:

confus@confusion:~$ ps -A
...
4438 ?        00:00:00 java
4439 ?        00:00:00 java
4443 ?        00:00:00 java
...

Назва процесу всіх запущених .jars - це, природно, "java". Як я дізнаюся, який з цих "Java" -процесів - це той, кого я хочу вбити, тобто той, що працює foobar.jar?


Зауважте, що якщо ви працюєте як один і той же користувач, ви можете приєднати до нього, наприклад, visualvm і перевірити його, перш ніж його вбити.
Thorbjørn Ravn Andersen

Відповіді:


11

Ви можете запустити lsofкоманду, в якій перераховано, які процеси обробляють відкриті файли, при цьому ваш jar файл подається як аргумент. Приклад перегляду файлу з меншою кількістю:

egil@mutter:~$ lsof foo.c
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
less    18871 egil    4r   REG    8,2        0 53862540 foo.c
egil@mutter:~$

Щоб легко використовувати pid у сценарії, ви можете запустити його у короткому режимі:

egil@mutter:~$ lsof -t foo.c
18871

Ця відповідь ще краща. +1.
Октавіан А. Дам’ян

7

Використання ps axдопоможе.

Він буде відображати дерево процесу в стилі BSD, який просто показує більше інформації.

Щоб знайти свій конкретний процес, вам просто потрібно поцікавитися назвою JAR. ps ax | grep JARNAMEзробимо це.


1

Ви можете зробити це нативно, або якщо "lsof" не встановлено через / proc // fd Приклад:

ps -ef|grep -w java
...
0c4       6917  6916  0 12:22 pts/7    00:00:00 java
...

ls -la /proc/6917/fd/
total 0
dr-x------ 2 0c4 svauser  0 Apr  2 12:23 .
dr-xr-xr-x 9 0c4 svauser  0 Apr  2 12:22 ..
lrwx------ 1 0c4 svauser 64 Apr  2 12:23 0 -> /dev/pts/7
lrwx------ 1 0c4 svauser 64 Apr  2 12:23 1 -> /dev/pts/7
lrwx------ 1 0c4 svauser 64 Apr  2 12:23 2 -> /dev/pts/7
lr-x------ 1 0c4 svauser 64 Apr  2 12:23 3 -> /opt/jdk1.8.0_191/jre/lib/rt.jar
lr-x------ 1 0c4 svauser 64 Apr  2 12:23 4 -> /media/veracrypt1/Downloads/rr/testone.jar
lr-x------ 1 0c4 svauser 64 Apr  2 12:23 5 -> /usr/share/java/gnu-getopt-1.0.14.jar

0

Ви можете використовувати jpsз -lпараметрами, які повернуть файл .jar, який використовується з повним шляхом.

-l Відображає повне ім'я пакета для основного класу програми або повне ім'я шляху до файлу JAR програми.


jps не був присутній у програмах Java, коли це було задано. Він доступний у тих, які доступні сьогодні.
Thorbjørn Ravn Andersen

Я бачу це на Java SE 6 docs: docs.oracle.com/javase/6/docs/technotes/tools/share/jps.html , і це з грудня 2006 року, як я бачу тут: en.wikipedia.org/ wiki / Java_version_history # Java_SE_7
froblesmartin
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.