¿Cómo puedo averiguar qué archivos jar está ejecutando java actualmente (y sus PID)?

12

Tengo un .jararchivo que es conocido por el mal funcionamiento. Cuando ocurre un mal funcionamiento, solo ayuda un reinicio. Tengo una manera de detectar ese mal funcionamiento (leyendo el archivo de registro de dicho .jar) Así que quiero escribir un script, que mata el proceso cada vez que ocurre el mal funcionamiento. El problema es:

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

El nombre del proceso de todos los .jars en ejecución es naturalmente "java". ¿Cómo puedo averiguar cuál de estos procesos "java" es el que quiero matar, es decir, el que se está ejecutando foobar.jar?

confundir
fuente
Tenga en cuenta que si se ejecuta como el mismo usuario, puede adjuntarlo usando, por ejemplo, visualvm e inspeccionarlo antes de matarlo.
Thorbjørn Ravn Andersen

Respuestas:

11

Puede ejecutar el lsofcomando, que enumera qué procesos tiene archivos abiertos, con su archivo jar dado como argumento. Un ejemplo de visualización de un archivo con menos:

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

Para reutilizar fácilmente el pid en un script, puede ejecutarlo en modo conciso:

egil@mutter:~$ lsof -t foo.c
18871
Egil
fuente
Esta respuesta es aún mejor. +1.
Octavian A. Damiean
7

Usar ps axayudará.

Mostrará el árbol de procesos en un estilo BSD que simplemente muestra más información.

Para encontrar su proceso particular solo tiene que buscar el nombre JAR. ps ax | grep JARNAMElo haré.

Octavian A. Damiean
fuente
1

Puede hacer esto nativo o si "lsof" no está instalado a través de / proc // fd Ejemplo:

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

Puede usar jpslas -lopciones que devolverán el archivo .jar usado con la ruta completa.

-l Muestra el nombre completo del paquete para la clase principal de la aplicación o el nombre completo de la ruta al archivo JAR de la aplicación.

froblesmartin
fuente
jps no estaba presente en los tiempos de ejecución de Java disponibles cuando se hizo la pregunta. Está disponible en los disponibles hoy.
Thorbjørn Ravn Andersen
Puedo verlo en Java SE 6 docs: docs.oracle.com/javase/6/docs/technotes/tools/share/jps.html , y eso es de diciembre de 2006, como puedo ver aquí: en.wikipedia.org/ wiki / Java_version_history # Java_SE_7
froblesmartin