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,