Jak mogę dowiedzieć się, które pliki jar w Javie są obecnie uruchomione (i ich PID)?

12

Mam .jarplik, który jest znany z nieprawidłowego działania. Gdy wystąpi awaria, pomaga tylko ponowne uruchomienie. Mam sposób na wykrycie tych awarii (odczytanie pliku dziennika wspomnianego .jar) Więc chcę napisać skrypt, który zabije cały proces, gdy tylko wystąpi awaria. Problemem jest:

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

Nazwa wszystkich działających .jars to oczywiście „java”. Jak dowiem się, który z tych procesów „java” jest tym, który chcę zabić, tj. Tym, który działa foobar.jar?

dezorientować
źródło
Pamiętaj, że jeśli działasz jako ten sam użytkownik, możesz dołączyć do niego za pomocą na przykład visualvm i sprawdzić go przed zabiciem.
Thorbjørn Ravn Andersen

Odpowiedzi:

11

Możesz uruchomić lsofpolecenie, które pokazuje, które procesy mają otwarte pliki, z plikiem jar podanym jako argument. Przykład przeglądania pliku z mniejszą liczbą:

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:~$

Aby łatwo ponownie użyć pid w skrypcie, możesz uruchomić go w trybie zwięzłym:

egil@mutter:~$ lsof -t foo.c
18871
Egil
źródło
Ta odpowiedź jest jeszcze lepsza. +1.
Octavian A. Damiean,
7

Korzystanie ps axpomoże.

Wyświetli drzewo procesów w stylu BSD, który po prostu pokazuje znacznie więcej informacji.

Aby znaleźć swój konkretny proces, wystarczy grep dla nazwy JAR. ps ax | grep JARNAMEzrobię to.

Oktawian A. Damiean
źródło
1

Możesz to zrobić natywnie lub jeśli „lsof” nie jest zainstalowany przez / proc // fd Przykład:

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
źródło
0

Można korzystać jpsz -lopcji, które zwróci plik .jar używane z pełną ścieżką.

-l Wyświetla pełną nazwę pakietu dla głównej klasy aplikacji lub pełną nazwę ścieżki do pliku JAR aplikacji.

froblesmartin
źródło
jps nie był obecny w środowiskach wykonawczych Java dostępnych, gdy zadano pytanie. Jest dostępny w tych dostępnych dzisiaj.
Thorbjørn Ravn Andersen
Widzę to w dokumentacji Java SE 6: docs.oracle.com/javase/6/docs/technotes/tools/share/jps.html , i to od grudnia 2006 roku, jak widzę tutaj: en.wikipedia.org/ wiki / Java_version_history # Java_SE_7
froblesmartin