Mata procesos Java

25

Estoy trabajando en un código computacionalmente pesado que, por ahora, se bloquea mucho, pero todavía estoy trabajando en él :) Cuando se bloquea, no puedo cerrar la ventana de la GUI; Tengo que abrir un shell y matar -9 el proceso.

Es un proceso de Java y es 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

Ahora es fácil pero una tarea bastante mecánica. Entonces, normalmente espero que se bloqueen entre 7 y 8 procesos, y luego kill -9cada uno de ellos.

Quiero hacer esto de forma automática. Creo que debería ser fácil canalizar algunos comandos para tomar la identificación de los resultados (n-1) ps aux | grep javay matarlos, pero no tengo idea de por dónde empezar.

¿Alguien puede darme alguna pista?

nkint
fuente

Respuestas:

22

Unas pocas tuberías más te llevarán a donde quieres estar. Así es como lo haría:

search_terms='whatever will help find the specific process' 

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

Esto es lo que está sucediendo:

grep -v 'grep' excluye el proceso grep de los resultados.

awk '{print $2}' imprime solo la segunda columna de la salida (en este caso, el PID)

$(...)es la sustitución de comandos. Básicamente, el resultado del comando interno se utilizará como argumento parakill

Esto tiene el beneficio de un control más fino sobre lo que se mata. Por ejemplo, si está en un sistema compartido, puede editar los términos de búsqueda para que solo intente eliminar sus propios procesos de Java.

Decano
fuente
49

Si desea eliminar todos los procesos que se nombran java, puede usar el siguiente comando:

killall -9 java

Este comando envía señales a los procesos identificados por su nombre.

Milan Todorovic
fuente
killall javano estaba funcionando para mí por alguna razón aleatoria que no pude resolver. El -9parámetro se encargó de eso. Gracias.
Paul Nelson Baker,
55
9 es SIGKILL. El programa no puede ignorarlo, y básicamente dice: finalízate ahora.
Milan Todorovic
Los usuarios de IntelliJ pueden encontrar que su IDE se ha bloqueado sin mencionar Tomcat y muchas otras aplicaciones. Esta es una forma de fuerza bruta y no se recomienda en ningún sistema con servicios o aplicaciones de productividad confiables java.
Tresf
3

Abra un editor de texto y guarde este breve script bash en su directorio de inicio como 'killjava'

#! /bin/bash

# Kill Java process

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

kill -9 $PID

Luego chmod u+x ~/killjavaen un terminal para que pueda ejecutar el archivo.

Luego puede llamar ~/killjavadesde una terminal y su proceso Java estará completamente muerto. Es posible que desee considerar qué otros recursos afectará su destrucción del proceso Java de esta manera (como las conexiones de la base de datos). Por ejemplo, tal vezkill -15 sería más apropiado: vea la explicación aquí .

Clive van Hilten
fuente
2

Aquí hay un enfoque alternativo, basado en la respuesta anterior de @ Dean.

Esto usa jps para identificar el proceso de Java.

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

MainClass es una clase en su programa Java en ejecución que contiene el método principal.

Pawan
fuente