Matar processos Java

25

Estou trabalhando em um código computacionalmente pesado que - por enquanto - trava muito, mas ainda estou trabalhando nele :) Quando ele trava, não consigo fechar a janela da GUI; Eu tenho que abrir um shell e matar -9 o processo.

É um processo Java e é fácil de encontrar:

nkint@zefiro:~$ ps aux | grep java
nkint   2705 16.6  1.0 460928 43680 ?        Sl   12:23   0:08 /usr/lib/jvm/java-6-sun-1.6.0.26/bin/java -Djava.library.path=something something
nkint   2809  0.0  0.0   4012   776 pts/0    S+   12:24   0:00 grep --color=auto java
nkint@zefiro:~$ kill -9 2705

Agora é fácil, mas é uma tarefa bastante mecânica. Normalmente, espero por cerca de 7-8 processos travarem e, em seguida, kill -9cada um deles.

Eu quero fazer isso de forma automática. Eu acho que deve ser fácil canalizar alguns comandos para pegar o id dos resultados (n-1) ps aux | grep javae matá-lo, mas não tenho nenhuma idéia por onde começar.

Alguém pode me dar alguma dica?

nkint
fonte

Respostas:

22

Mais alguns tubos o levarão aonde você quer estar. Aqui está como eu faria isso:

search_terms='whatever will help find the specific process' 

kill $(ps aux | grep "$search_terms" | grep -v 'grep' | awk '{print $2}')

Aqui está o que está acontecendo:

grep -v 'grep' exclui o processo grep dos resultados.

awk '{print $2}' imprime apenas a 2ª coluna da saída (neste caso, o PID)

$(...)é substituição de comando. Basicamente, o resultado do comando interno será usado como argumento parakill

Isso tem o benefício de um controle mais preciso sobre o que é morto. Por exemplo, se você estiver em um sistema compartilhado, poderá editar os termos de pesquisa para que ele tente apenas matar seus próprios processos java.

reitor
fonte
49

Se você deseja eliminar todos os processos nomeados, javause o seguinte comando:

killall -9 java

Este comando envia sinais para processos identificados por seus nomes.

Milan Todorovic
fonte
killall javanão estava funcionando para mim por algum motivo aleatório que não consegui resolver. O -9parâmetro cuidou disso. Obrigado.
Paul Nelson Baker
5
9 é SIGKILL. O programa não pode ignorá-lo, e basicamente diz: encerre-se agora.
Milan Todorovic
Os usuários do IntelliJ podem achar que seu IDE travou, sem mencionar o Tomcat e muitos outros aplicativos. Essa é uma maneira de força bruta e não é recomendada em qualquer sistema com serviços ou aplicativos de produtividade em que se baseia java.
tresf 9/10
3

Abra um editor de texto e salve esse script bash curto no diretório inicial como 'killjava'

#! /bin/bash

# Kill Java process

# Determine the pid
PID=`ps -C java -o pid=`

kill -9 $PID

Em seguida, chmod u+x ~/killjavaem um terminal para que você possa executar o arquivo.

Então você pode simplesmente ligar a ~/killjavapartir de um terminal e seu processo Java estará completamente morto. Você pode considerar quais outros recursos sua eliminação do processo Java dessa maneira (como conexões com o banco de dados) serão afetados. Por exemplo, talvez kill -15seja mais apropriado - veja a explicação aqui .

Clive van Hilten
fonte
2

Aqui está uma abordagem alternativa, baseada na resposta anterior de @ Dean.

Isso usa jps para identificar o processo java.

kill $(jps | grep <MainClass> | awk '{print $1}')

MainClass é uma classe no seu programa java em execução que contém o método principal.

Pawan
fonte