Comment savoir quels fichiers jar Java est en cours d'exécution (et leurs PID)?

12

J'ai un .jarfichier qui est connu pour des dysfonctionnements. En cas de dysfonctionnement, seul un redémarrage est utile. J'ai un moyen de détecter ces dysfonctionnements (lecture du fichier journal de ladite .jar) Donc je veux écrire un script, qui tue le processus chaque fois que le dysfonctionnement se produit. Le problème est:

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

Le nom de processus de tous les .jars en cours d'exécution est naturellement "java". Comment puis-je savoir lequel de ces processus "java" est celui que je veux tuer, c'est-à-dire celui en cours d'exécution foobar.jar?

embrouiller
la source
Notez que si vous exécutez en tant que même utilisateur, vous pouvez vous y attacher en utilisant par exemple visualvm et l'inspecter avant de le tuer.
Thorbjørn Ravn Andersen

Réponses:

11

Vous pouvez exécuter la lsofcommande, qui répertorie les processus qui ont des fichiers ouverts, avec votre fichier jar donné en argument. Un exemple de visualisation d'un fichier avec moins:

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

Pour réutiliser facilement le pid dans un script, vous pouvez l'exécuter en mode laconique:

egil@mutter:~$ lsof -t foo.c
18871
Egil
la source
Cette réponse est encore meilleure. +1.
Octavian A. Damiean,
7

L'utilisation vous ps axaidera.

Il affichera l'arborescence des processus dans un style BSD qui montre simplement bien plus d'informations.

Pour trouver votre processus particulier, il vous suffit de rechercher le nom JAR. ps ax | grep JARNAMEle fera.

Octavian A. Damiean
la source
1

Vous pouvez le faire nativement ou si "lsof" n'est pas installé via / proc // fd Exemple:

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
la source
0

Vous pouvez utiliser jpsavec les -loptions qui renverront le fichier .jar utilisé avec le chemin complet.

-l Affiche le nom complet du package de la classe principale de l'application ou le nom complet du chemin d'accès au fichier JAR de l'application.

froblesmartin
la source
jps n'était pas présent dans les runtimes Java disponibles lorsque la question a été posée. Il est disponible dans ceux disponibles aujourd'hui.
Thorbjørn Ravn Andersen
Je peux le voir sur les documents Java SE 6: docs.oracle.com/javase/6/docs/technotes/tools/share/jps.html , et c'est à partir de décembre 2006 comme je peux le voir ici: en.wikipedia.org/ wiki / Java_version_history # Java_SE_7
froblesmartin