Mate apenas um processo Java

14

Geralmente, executo alguns aplicativos Java, um para o servidor em execução localmente e outro para alguns IDE, como o NetBeans. E, de tempos em tempos, após várias reimplementações, meu servidor fica preso em OutOfMemoryException, portanto, preciso matar o processo Java para poder reinicializá-lo.

Então, eu faço pkill -9 java , mas isso também mata a minha IDE de execução, que eu não quero. Então, como faço para matar apenas o aplicativo vinculado ao servidor em execução e não os outros? Eu suponho que todos eles estão sendo executados no mesmo processo, mas tem que haver alguma maneira de distingui-los.

    
por Petr Mensik 13.02.2013 / 09:17

5 respostas

19

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

Para obter o ID do processo desse 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) desse processo que você deseja eliminar e executar

kill -9 PID
    
por 13.02.2013 / 09:36
8

IMO a melhor solução é:

pkill -9 -f <nameOfYourJavaAplication>
    
por 13.02.2013 / 15:52
5

Em vez de usar ps e grep , você pode usar ps ' -C flag para selecionar todos os comandos listados com o nome' java '. Você também pode usar o ps -f flag 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 completo: ps -fC java .

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

Quando você tiver o PID do comando que deseja matar, use kill com o sinalizador -9 (SIGKILL) e o PID do processo java que você deseja eliminar. Java nem sempre para quando recebe um sinal 'SIGTERM' (processos são permitidos para lidar com 'SIGTERM'), então enviar o sinal 'SIGKILL', que faz o init matar o programa sem avisá-lo primeiro, é freqüentemente necessário. / p>

Por exemplo, se ps -fC java retornar

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 java retornam

9014 java IDE
11775 java TestProgram

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

    
por 13.02.2013 / 14:49
0

jps e jcmd são ferramentas especializadas em exibir apenas informações de processos Java e PIDs.

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

    
por 10.10.2018 / 19:00
0

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

Substitua a parte <PROCESS_NAME> pelo que estiver executando o java.

#!/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) falhar. Eu também sugiro que você use o nome do sinal que facilita a leitura:

kill -TERM ${process}

AVISO

Antes de executar o kill ... , certifique-se de que a variável $process seja configurada conforme o esperado. O ps -ef pode ser diferente entre os Unices, então awk pode precisar imprimir um parâmetro diferente.

Nota

O <PROCESS_NAME> pode ser alterado em uma variável. Apenas lembre-se de que, se você precisar digitá-lo em sua 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 do script awk . Isso significa que você precisa fechar e reabrir a string com a variável intermediária. Algo como isso deve funcionar (não testado):

process='ps -ef | grep -v awk | awk -e '/java.*'"${PROCESS_NAME}"'/ { print $2 }''
    
por 01.12.2018 / 04:27