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.