Como descobrir qual java de arquivos jar está em execução no momento (e seus PIDs)?

12

Eu tenho um .jararquivo que é notório por mau funcionamento. Quando ocorre um mau funcionamento, apenas uma reinicialização ajuda. Eu tenho uma maneira de detectar esse mau funcionamento (lendo o arquivo de log do dito .jar). Então, eu quero escrever um script, que encerre o processo sempre que ocorrer o mau funcionamento. O problema é:

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

O nome do processo de todos os .jars em execução é naturalmente "java". Como descubro qual desses processos "java" é o que eu quero matar, ou seja, o que está sendo executado foobar.jar?

confundir
fonte
Observe que se você executar como o mesmo usuário, poderá anexá-lo usando, por exemplo, visualvm e inspecioná-lo antes de matá-lo.
Thorbjørn Ravn Andersen

Respostas:

11

Você pode executar o lsofcomando, que lista quais processos possuem arquivos abertos, com seu arquivo jar fornecido como argumento. Um exemplo de exibição de um arquivo com 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 facilmente o pid em um script, você pode executá-lo no modo conciso:

egil@mutter:~$ lsof -t foo.c
18871
Egil
fonte
Essa resposta é ainda melhor. +1.
Otaviano A. Damiean
7

Usar ps axajudará.

Ele exibirá a árvore de processos em um estilo BSD que simplesmente mostra muito mais informações.

Para encontrar seu processo específico, você apenas precisa grep para o nome JAR. ps ax | grep JARNAMEvai fazer isso.

Otaviano A. Damiean
fonte
1

Você pode fazer isso nativo ou se "lsof" não estiver instalado via / proc // fd Exemplo:

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

Você pode usar jpscom as -lopções que retornarão o arquivo .jar usado com o caminho completo.

-l Exibe o nome completo do pacote para a classe principal do aplicativo ou o nome completo do caminho para o arquivo JAR do aplicativo.

froblesmartin
fonte
O jps não estava presente nos tempos de execução do Java disponíveis quando a pergunta foi feita. Está disponível naqueles disponíveis hoje.
Thorbjørn Ravn Andersen
Eu posso vê-lo nos documentos do Java SE 6: docs.oracle.com/javase/6/docs/technotes/tools/share/jps.html , e isso é a partir de dezembro de 2006, como posso ver aqui: en.wikipedia.org/ wiki / Java_version_history # Java_SE_7
froblesmartin