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.

Petr Mensik
fonte
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
P4cK3tHuNt3R
fonte
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>
Marek R
fonte
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.


fonte
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

Nikhil VJ
fonte
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.

Muhammad Gelbana
fonte
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 }'`
Alexis Wilke
fonte