Mata solo un proceso Java

16

Normalmente ejecuto pocas aplicaciones Java, una para el servidor que se ejecuta localmente y otra para algunos IDE como NetBeans. Y de vez en cuando, después de muchas implementaciones, mi servidor se atasca en OutOfMemoryException, así que necesito eliminar el proceso de Java para reiniciar.

Entonces lo hago, pkill -9 javapero esto también mata mi IDE en ejecución, lo que no quiero. Entonces, ¿cómo elimino solo las aplicaciones vinculadas al servidor en ejecución y no las otras? Supongo que todas se ejecutan bajo el mismo proceso, pero tiene que haber alguna forma de disuadirlas.

Petr Mensik
fuente
2
mira tu tabla de proceso (vía topo ps) y elige la correcta y mátala por PID (kill -9 PID_number).
prisa
Oh sí, puedo ver eso ahora. Entonces solo necesito matar el proceso con la derecha PID. Muchas gracias
Petr Mensik
Necesito automatizar esto. ¿Cómo obtener el PID para el programa en particular?
Nikhil VJ

Respuestas:

22

Para matar un proceso que está asociado con múltiples procesos, debe matarlo utilizando la identificación de proceso asociada con ese proceso.

Para obtener la identificación del proceso de ese proceso de Java, ejecute

ps -A |grep java

La salida de este comando dará la lista de procesos de Java que se ejecutan en su sistema. Anote la ID de proceso (PID) de ese proceso a quien desea matar y ejecutar

kill -9 PID
P4cK3tHuNt3R
fuente
Si quieres matar TODOS los procesos de Java con un solo comandops ax | grep java | grep -v 'grep' | cut -d '?' -f1 | xargs kill -9
Andrii Karaivanskyi
11

OMI, la mejor solución es:

pkill -9 -f <nameOfYourJavaAplication>
Marek R
fuente
Perfecto. Solía ps -fC javaencontrar nameOfYourJavaAplication(en -Dprogram.name)
cactuschibre
8

En lugar de usar psy grep, puede usar psla -Cbandera de 's para seleccionar todos los comandos listados con el nombre' java '. Es posible que también desee utilizar psla -fbandera de '' para imprimir el nombre completo del comando de cada proceso de la lista. De esa manera, puede ver lo que cada proceso de Java está haciendo realmente. Este es el comando en su totalidad: ps -fC java.

También puede usar pgreppara enumerar todos los procesos de Java. pgrep -a javadevolverá el PID y la línea de comando completa de cada proceso de Java.

Una vez que tenga el PID del comando que desea matar, úselo killcon la -9bandera (SIGKILL) y el PID del proceso de Java que desea matar. Java no siempre se detiene cuando recibe una señal 'SIGTERM' (los procesos pueden manejar 'SIGTERM'), por lo que a menudo es necesario enviarle la señal 'SIGKILL', que hace que init elimine el programa sin advertirlo primero.

Por ejemplo, si ps -fC javadevuelve

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

o psgrep -a javavuelve

9014 java IDE
11775 java TestProgram

y deseas matar java TestProgram, deberías correr kill -9 11775.


fuente
1

Si desea que un script encuentre y elimine su programa en ejecución (específico) utilizando un patrón de la línea de comando del programa (y no solo cada cosa de Java que se está ejecutando), entonces:

pgrep -f pattern # shows the PID
pkill -f pattern

Desde /unix//a/31111/249209

Nikhil VJ
fuente
Observe que "pkill" ya se mencionó en la respuesta de Marek R del 13 de febrero de 2013
Jeff Schaller
0

jpsy jcmdson herramientas especializadas en mostrar solo información de procesos Java y PID.

Puede explorar sus opciones para obtener una salida más detallada.

Muhammad Gelbana
fuente
Esos solo se enumeran en mi computadora.
Alexis Wilke
Entonces, ¿estás seguro de que hay otros procesos Java en ejecución?
Muhammad Gelbana
Si. Tenía a Cassandra o Elassadra corriendo cuando probaba tu comando.
Alexis Wilke
0

Aquí hay un script que se puede usar para automatizar el proceso.

Reemplace la <PROCESS_NAME>parte con lo que sea que Java esté ejecutando.

#!/bin/sh
process=`ps -ef | grep -v awk | awk -e '/java.*<PROCESS_NAME>/ { print $2 }'`
kill ${process}

Nota: no puse el -9. No debería ser requerido a menos que capture señales y SIGTERM(el valor predeterminado) falle. También te sugiero que uses el nombre de la señal que hace que sea más fácil de leer:

kill -TERM ${process}

ADVERTENCIA

Antes de ejecutar, kill ...asegúrese de que la $processvariable se establece como se esperaba. El ps -efpuede ser diferente entre Unices, por lo que es awkposible que necesite imprimir un parámetro diferente.

Nota

El <PROCESS_NAME>podría ser cambiado a una variable. Solo recuerde que si tiene que escribirlo en su línea de comando cada vez, es probable que cometa errores de vez en cuando. Me resulta más fácil tener una copia múltiple del script con el nombre correcto.

También importante: observe las comillas simples para el awkguión. Eso significa que debe cerrar y volver a abrir la cadena con la variable en el medio. Algo como esto debería funcionar (no probado):

process=`ps -ef | grep -v awk | awk -e '/java.*'"${PROCESS_NAME}"'/ { print $2 }'`
Alexis Wilke
fuente