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

26 mar 2008

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,

Comparte esta entrada:
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • LinkedIn
  • Meneame
  • RSS
  • Twitter

6 Respuestas Para “Matar un proceso externo desde Java (por nombre, no por pid)”

  1. Juanma 08 de julio de 2008 at 08:09 hrs. #

    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. loloyo 14 de diciembre de 2009 at 15:50 hrs. #

    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. Leandro 17 de febrero de 2010 at 18:00 hrs. #

    Ese código esta perfecto
    Felicidades !!!

  4. Edwin 19 de mayo de 2011 at 16:52 hrs. #

    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

Trackbacks and Pingbacks

  1. Matar procesos desde Java - 02 de abril de 2008

    [...] Veremos una aplicación muy sencilla, de un ejemplo publicado en Xnoccio. [...]

Deje una respuesta