Matar un proceso externo desde Java (por nombre, no por pid)

Recientemente nos hemos enfrentado a un problema en uno de nuestros proyectos.

Resulta que el servidor OpenOffice que usamos en ese proyecto para determinadas tareas, en algunas circunstancias se queda totalmente “tonto”. El proceso esta ahi, el servidor no hace crash, pero no responde a ninguna llamada.

Decidimos cortar por lo sano, y hacernos un daemon que chequease si el servidor estaba respondiendo. Si no responde, matamos el servidor, y lo rearrancamos.

No tiene mucho misterio el tema.

Pero nos enfrentamos a algo que nunca antes habiamos hecho: Como matar un proceso que no habiamos iniciado nosotros y del que unicamente sabiamos su nombre?

Bueno, buscando un poco en google, y sacando ideas de un foro aqui, y otro foro alli, llegamos a desarrollar esta funcion que quizas le sea de ayuda a alguien que tenga en el futuro un problema similar.

Por supuesto el daemon debe tener privilegios de nivel suficiente para ser capaz de acabar con el proceso a matar, en nuestro caso “soffice”.


private void matarSoffice() {
 String osName = System.getProperty("os.name");
 String cmd =  "";
 if(osName.toUpperCase().contains("WIN")){//S.O. Windows
	cmd+="tskill soffice";
 }else{//Solo ha sido probado en win y linux
	cmd+="killall soffice";
 }
 Process hijo;
 try {
	hijo = Runtime.getRuntime().exec(cmd);
	hijo.waitFor();
	if ( hijo.exitValue()==0){
		System.out.println("soffice matado con exito");
	}else{
		System.out.println("Incapaz de matar soffice. Exit code: " + hijo.exitValue()+"n");
	}
 } catch (IOException e) {
	System.out.println("Incapaz de matar soffice.");
 } catch (InterruptedException e) {
	System.out.println("Incapaz de matar soffice.");
 }
}

Hala pues,

Comentarios

  1. cmd =”tskill soffice”;

    Puedes utilizar el * (asterisco) para que elimine todos los nombres que comiencen por lo que escribas.
    También he visto que con algunos procesoso no me ha funcionado bien por el nombre, así que lo he mejorado añadiendo el parámetro “/im”, ejemplo:
    cmd =”tskill /im soffice”;

  2. Disculpen pero tengo unas dudas con respecto a lo que es PID y para que sirve porq tengo algunos errores con un servidor y me arroja una serie de PID 5156 y no se que significa???? le agradezco su pronta respuesta = )

  3. Hola, me parece interesante, pero que como haces para matar a un proceso de Java, porque imaginate, que yo hago un programa de java para matar al otro que también es java.

    En el Task manager aparecen los dos
    java.exe
    java.exe

  4. Hola! en java me dice que los últimos dos catch pueden convertirse en un multicatch, y yo le agregaría al sout el mensaje de error 😛

    pero muchísimas gracias!

Comments are closed.