Mate apenas um processo Java


16

Normalmente, executo alguns aplicativos Java, um para servidor executando localmente e outro para alguns IDE como o NetBeans. E, de tempos em tempos, após muitas reimplantações, meu servidor fica preso no OutOfMemoryException, por isso preciso interromper o processo Java para reiniciar.

Então eu faço, pkill -9 javamas isso também mata meu IDE em execução, o que eu não quero. Então, como matar apenas aplicativos vinculados ao servidor em execução e não os outros? Suponho que todos eles estejam executando no mesmo processo, mas deve haver alguma maneira de distendê-los.


2
olhe para sua tabela de processos (via topou ps) e escolha a correta e mate-a por PID (kill -9 PID_number).
— rush

Oh sim, eu posso ver isso agora. Então, eu só preciso matar o processo com a razão PID. Muito obrigado
— Petr Mensik

Eu preciso automatizar isso. Como obter o PID para o programa específico?
— Nikhil VJ

Respostas:


22

Para matar um processo que está associado a vários processos, você precisa matá-lo usando o ID do processo associado a esse processo.

Para obter a identificação do processo java, execute

ps -A |grep java

A saída deste comando fornecerá a lista de processos java em execução no seu sistema. Anote o ID do processo (PID) do processo que você deseja matar e executar

kill -9 PID

Se você quer matar todos os processos Java por um comandops ax | grep java | grep -v 'grep' | cut -d '?' -f1 | xargs kill -9
— Andrii Karaivanskyi

11

IMO, a melhor solução é:

pkill -9 -f <nameOfYourJavaAplication>

Perfeito. I utilizado ps -fC javapara encontrar nameOfYourJavaAplication(em -Dprogram.name)
— cactuschibre

8

Em vez de usar pse grep, você pode usar pso -Csinalizador de 's para selecionar todos os comandos listados com o nome' java '. Você também pode usar pso -fsinalizador para imprimir o nome completo do comando de cada processo listado. Dessa forma, você pode ver o que cada processo java está realmente fazendo. Aqui está o comando na íntegra: ps -fC java.

Você também pode usar pgreppara listar todos os processos java. pgrep -a javaretornará o PID e a linha de comando completa de cada processo java.

Depois de ter o PID do comando que deseja matar, use killcom a -9bandeira (SIGKILL) e o PID do processo java que deseja matar. O Java nem sempre pára quando recebe um sinal 'SIGTERM' (os processos têm permissão para manipular 'SIGTERM'); portanto, é frequentemente necessário enviar o sinal 'SIGKILL', que faz o init matar o programa sem avisar primeiro.

Por exemplo, se ps -fC javaretorna

UID        PID  PPID  C STIME TTY          TIME CMD
jeff      9014  8890  0 08:51 pts/0    00:00:00 java IDE
jeff     11775  8890  6 08:59 pts/0    00:00:00 java TestProgram

ou psgrep -a javaretorna

9014 java IDE
11775 java TestProgram

e você deseja matar java TestProgram, você deve correr kill -9 11775.


1

Se você deseja que um script encontre e mate seu programa em execução (específico) usando um padrão da linha de comando do programa (e não apenas todas as coisas em java que você está executando), então:

pgrep -f pattern # shows the PID
pkill -f pattern

De /unix//a/31111/249209


Observe que "pkill" já foi mencionado na resposta de Marek R em 13 de fevereiro de 13
— Jeff Schaller

0

jpse jcmdsão ferramentas especializadas em exibir apenas informações de processos Java e PIDs.

Você pode explorar suas opções para obter uma saída mais detalhada.


Aqueles só se listam no meu computador.
— Alexis Wilke

Então, você tem certeza de que existem outros processos Java em execução ?!
— Muhammad Gelbana

Sim. Eu tinha Cassandra ou Elassadra em execução ao testar seu comando.
— Alexis Wilke

0

Aqui está um script que se pode usar para automatizar o processo.

Substitua a <PROCESS_NAME>peça por qualquer java que esteja executando.

#!/bin/sh
process=`ps -ef | grep -v awk | awk -e '/java.*<PROCESS_NAME>/ { print $2 }'`
kill ${process}

Nota: Eu não coloquei o -9. Eu não deveria ser exigido, a menos que você capture sinais e SIGTERM(o padrão) falhe. Eu também sugiro que você use o nome do sinal, o que facilita a leitura:

kill -TERM ${process}

ATENÇÃO

Antes de executar, kill ...verifique se a $processvariável é definida como esperado. O ps -efdiferente pode entre Unices assim awkser necessário imprimir um parâmetro diferente.

Nota

A <PROCESS_NAME>poderia ser modificada para uma variável. Lembre-se de que, se você precisar digitá-lo na linha de comando a cada vez, é provável que cometa erros de vez em quando. Acho mais fácil ter várias cópias do script com o nome correto.

Também importante: observe as aspas simples para o awkscript. Isso significa que você precisa fechar e reabrir a string com a variável no meio. Algo assim deve funcionar (não testado):

process=`ps -ef | grep -v awk | awk -e '/java.*'"${PROCESS_NAME}"'/ { print $2 }'`
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.