Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > PID de Procesos

Buenos dias.
Espero que me podais ayudar en este problema que se me plantea.
Os cuento. Estoy realizando una aplicación de automatización de trabajos almacenados en colas de tareas. Es decir, existen varias colas (A, B, C, D...) y en cada cola se crean varios trabajos para que sean ejecutados. Estas colas de tareas están en BBDD.
Pues bien, he realizado la aplicación con hilos.
Tengo una clase principal que se encarga de instanciar un hilo por cada cola existente. La clase es la misma solo cambia el identificados que se le da a cada hilo (uno por cada cola de tareas)
Cada hilo levantado se encarga de mirar en la cola que le corresponde y entre otras cosas que no vienen al caso lo que hace es tomar la tarea que exista y ejecutarla. Al ejecutarla actualiza el estado de la cola poniendo el PID del trabajo. Esto se hace para que en el caso de matar el trabajo que se pueda hacer un kill -9 en la máquina donde corre que es Linux.
La encargada de ejecutar el trabajo es otro hilo y es este el que debe tomar el PID de la ejecución y actualizarlo en BBDD. Es decir, cada hilo (cola) levante un hilo (trabajo) por cada trabajo que encuentra en su cola de tareas.

Ahora lo que hago para ejecutar el proceso es los siguiente:


ProcessBuilder pb = new ProcessBuilder("bash", "-c", sNewComando);
pb.redirectErrorStream(true);
Process shell = pb.start();

this.ponEnEjecucion();

is = new BufferedReader(new InputStreamReader(shell.getInputStream()));
while ((line = is.readLine()) != null)
Log.debug(line);

shell.waitFor();
setReturnValue(shell.exitValue());

Cuando llamo al metodo "this.ponEnEjecucion();" lo que hago es lo siguiente:

final String jvmName = ManagementFactory.getRuntimeMXBean().getName();
final int index = jvmName.indexOf('@');

if (index < 1) {
return fallback;
}

try {
return jvmName.substring(0, index);
} catch (NumberFormatException e) { }

return fallback;

Esto lo que me hace en teoria es darme el PID del proceso actual, peeeeeero me devuelve siempre el mismo PID, es decir, el PID de la ejecucion de la aplicación y no la del proceso que he lanzado con "ProcessBuilder".

Me podeis orientar, ayudar a recuperar el PID correcto en cada caso?

Agradecido de antemano, un saludo

marzo 29, 2012 | Unregistered Commenterfileal_v

Holas.

Supongo que con "el proceso que he lanzado" te refieres a la linea
Process shell = pb.start();

Bueno si esas colas y tareas que mencionas son objetos java, para identificarlos podrías usar el método "hashCode()" el cual tienen todas las instancias java. Con eso podrás saber que objeto lanzaste o que objeto recibes, etc etc.

También podrías probar con https://github.com/jezhumble/javasysmon/ que supuestamente es un "Manage OS processes" en java :) !!

Nos cuentas como te fue :) !!

marzo 30, 2012 | Registered Commenterjrichard

Buenos dias.
No me vale el método hasCode() ya que el usuario puede acceder a la cola y cancelar el trabajo y si es cancelado la aplicación debe matar el proceso lanzado en máquina. Por eso necesito el pid, para poder hacer un Kill.

Lo segundo que me propones tiene buena pinta, tengo que revisarlo a fondo y hacer pruebas pero en principio si parece que resuelve mi problema.

Hasta ahora yo lo había resuelto de la siguiente manera:


ProcessBuilder pb = new ProcessBuilder("bash", "-c", sNewComando);
pb.redirectErrorStream(true);
Process shell = pb.start();

Field fld = shell.getClass().getDeclaredField("pid");
fld.setAccessible(true);
(Integer) fld.get(shell); /* Aqui se recupera el pid. */

Con esto parece resuelto el problema, pero bueno, tengo que hacer muuuuuchas pruebas para darlo por válido.

Un saludo y gracias.

abril 2, 2012 | Unregistered Commenterfileal_v