Как я могу узнать, какие 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, и проверить его, прежде чем убить.
Торбьерн Равн Андерсен

Ответы:

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
0x0c4
источник
0

Вы можете использовать jpsс -lпараметрами, которые будут возвращать файл .jar, используемый с полным путем.

-l Отображает полное имя пакета для основного класса приложения или полный путь к файлу JAR приложения.

froblesmartin
источник
jps не присутствовал в среде выполнения Java, доступной, когда был задан вопрос. Это доступно в доступных сегодня.
Турбьерн Равн Андерсен
Я могу видеть это на 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