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?

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.


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.


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 .


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.

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.