Seleccionar y matar un proceso java determinado

Imaginemos el siguiente escenario: tenemos un servidor linux con varios procesos java corriendo, y quedemos matar a uno de ellos sin afectar el resto. En este post veremos cómo generar un script de linux para matar un proceso seleccionado según la clase que contiene el método main.
Si utilizamos el comando killall:

<br />
killall -9 java<br />

logramos parte de nuestro cometido (matar el proceso), pero seguramente nos traiga más problemas que soluciones, ya que matamos TODAS las máquinas virtuales java corriendo al momento de ejecutar el comando.

Podemos hacerlo de forma manual, haciendo un

<br />
ps -fea |grep java<br />

para luego seleccionar el PID (process id) correspondiente a nuestro proceso, tomando en cuenta la clase que inicia el proceso, el classpath utilizado o los parámetros de inicio y luego invocando el comando kill -9 PID.

Si vamos a matar un cierto proceso java bastante seguido, podemos crearnos un shell script que se tome el trabajo de buscar el proceso y matar únicamente al que nosotros querramos.

A este script únicamente le debemos configurar la variable MAIN_CLASS, que contendrá el nombre de la clase que contiene el método main (clase que inicia nuestra aplicación). Basándose en éste nombre, el script buscará todos los procesos que contengan ese nombre en la línea de comandos, extraerá el PID de las líneas que filtró, y ejecutará un kill -9 para cada proceso.

El script entonces, es el siguiente:

<br />
#!/bin/bash<br />
# Nombre del binario<br />
MAIN_CLASS=com.josearrarte.demo.MainClass</p>
<p># Cantidad de reintentos para matarlo<br />
CNT_INTENTOS=5</p>
<p># Funcion para matar el proceso<br />
matar(){<br />
INTENTO=1</p>
<p>while [ `ps -ef --cols=5000 |grep -v &quot;grep&quot;| grep -c ${MAIN_CLASS}` -gt 0 ] &amp;&amp; [ ${INTENTO} -le ${<br />
CNT_INTENTOS} ]; do<br />
  ps -ef --cols=5000 |grep -v &quot;grep&quot;| grep ${MAIN_CLASS}|awk '{ print $2 }'|xargs -i{} kill -9 {} &gt; /dev/null 2&gt; /dev/null<br />
  INTENTO=$(( ${INTENTO} + 1 ))<br />
done<br />
}</p>
<p>matar<br />

Queda abierta la sección de comentarios para proponer mejores formas de matar procesos java.

Etiquetado , . Bookmark the permalink.

Una respuesta a Seleccionar y matar un proceso java determinado

  1. Jordan says:

    Gracias, funciona a la perfección

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *