Wie kann ich herausfinden, welche JAR-Dateien Java derzeit ausführt (und deren PIDs)?

12

Ich habe eine .jarDatei, die für Störungen berüchtigt ist. Bei einer Störung hilft nur ein Neustart. Ich habe eine Möglichkeit, diese Fehlfunktionen zu erkennen (Lesen der besagten Protokolldatei .jar). Also möchte ich ein Skript schreiben, das den Prozess abbricht, wenn die Fehlfunktion auftritt. Das Problem ist:

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

Der Prozessname aller laufenden .jars ist natürlich "java". Wie finde ich heraus, welcher dieser "Java" -Prozesse derjenige ist, den ich beenden möchte, dh derjenige, der ausgeführt wird foobar.jar?

verwechseln
quelle
Beachten Sie, dass Sie, wenn Sie als derselbe Benutzer ausgeführt werden, eine Verknüpfung erstellen können, indem Sie beispielsweise visualvm verwenden und diese überprüfen, bevor Sie sie beenden.
Thorbjørn Ravn Andersen

Antworten:

11

Sie können den lsofBefehl ausführen , der auflistet, welche Prozesse Dateien geöffnet haben, wobei Ihre JAR-Datei als Argument angegeben wird. Ein Beispiel zum Anzeigen einer Datei mit weniger:

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

Um die PID in einem Skript einfach wiederzuverwenden, können Sie sie im knappen Modus ausführen:

egil@mutter:~$ lsof -t foo.c
18871
Egil
quelle
Diese Antwort ist noch besser. +1.
Octavian A. Damiean
7

Verwenden ps axwird helfen.

Es zeigt den Prozessbaum in einem BSD-Stil an, der einfach viel mehr Informationen anzeigt.

Um Ihren speziellen Prozess zu finden, müssen Sie nur nach dem JAR-Namen suchen. ps ax | grep JARNAMEwerde es tun.

Octavian A. Damiean
quelle
0

Sie können dies nativ tun oder wenn "lsof" nicht über / proc // fd installiert ist. Beispiel:

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
quelle
0

Sie können jpsmit den -lOptionen arbeiten, die die JAR-Datei zurückgeben, die mit dem vollständigen Pfad verwendet wird.

-l Zeigt den vollständigen Paketnamen für die Hauptklasse der Anwendung oder den vollständigen Pfadnamen zur JAR-Datei der Anwendung an.

Froblesmartin
quelle
jps war in den verfügbaren Java-Laufzeiten nicht vorhanden, als die Frage gestellt wurde. Es ist in den heute verfügbaren verfügbar.
Thorbjørn Ravn Andersen
Ich kann es auf Java SE 6-Dokumenten sehen: docs.oracle.com/javase/6/docs/technotes/tools/share/jps.html , und das ist ab Dezember 2006, wie ich hier sehen kann: en.wikipedia.org/ wiki / Java_version_history # Java_SE_7
froblesmartin