¿Cómo puedo encontrar el ID de proceso (pid) de un proceso iniciado en Java?

Si obtengo un objeto de proceso en Java a través de Runtime.getRuntime().exec(...) , o ProcessBuilder.start() , puedo esperarlo a través de Process.waitFor() , que es como Thread.join() , o podría matarlo con Process.destroy() , que es como el Thread.stop() obsoleto.

PERO: ¿Cómo encuentro el pid del Objeto de Proceso? No veo un método para hacerlo en The Official Documentation . ¿Puedo hacer esto en Java? ¿Si es así, cómo?

Este tipo grita para conseguir el PID. No estoy seguro de si hay una solución Java para el problema.

 /** * Gets a string representing the pid of this program - Java VM */ public static String getPid() throws IOException,InterruptedException { Vector commands=new Vector(); commands.add("/bin/bash"); commands.add("-c"); commands.add("echo $PPID"); ProcessBuilder pb=new ProcessBuilder(commands); Process pr=pb.start(); pr.waitFor(); if (pr.exitValue()==0) { BufferedReader outReader=new BufferedReader(new InputStreamReader(pr.getInputStream())); return outReader.readLine().trim(); } else { System.out.println("Error while getting PID"); return ""; } } 

Fuente: http://www.coderanch.com/t/109334/Linux-UNIX/UNIX-process-ID-java-program

Similar a las otras herramientas mencionadas, existe la herramienta de línea de comandos jps que viene con el tiempo de ejecución de Java. Escupe los PID de todas las JVM en ejecución. El beneficio es que la salida que se debe analizar se limita solo a los procesos de JVM.

Leo, después de analizar este tema durante una semana, creo que el enfoque de Jhurtado es probablemente el “mejor” enfoque que podemos manejar en Java en este momento. “mejor” es entre comillas porque tiene el muy desagradable efecto secundario de ser básicamente una “adivinanza” de lo que es el PID de su hijo.

Si su aplicación Java está generando procesos nativos rápidamente en un sistema de alta carga, NO hay garantía de que el PID que recoja en su cálculo de diferenciación sea el PID del Proceso iniciado por el Subproceso actual o que el PID del proceso elegido sea incluso generado por nuestra aplicación (tal vez el sistema host ya estaba ejecutando ese proceso de todos modos).

Dicho esto, si no estás generando docenas de procesos o el proceso nativo que estás generando es realmente único (algunos servicios personalizados que envías con tu aplicación), entonces este enfoque funciona bien, en cuyo caso el PID del proceso nativo que estás buscando es el que quieres

En Windows, puede usar ‘ lista de tareas ‘, como señaló Jhurtado para obtener la lista completa de PID y filtrar para la que desea (el uso del interruptor de filtro / FI no funcionó para mí en las pruebas).

En cualquier sistema * nix puedes usar ” ps ax | grep ” donde NAME es un nombre de proceso como ‘nginx’ o ‘httpd’ que deseas filtrar para obtener tu lista.

Además, si necesita matar procesos extraviados (por ejemplo, en la salida de VM) en * nix, puede usar ” kill -9 ” y en Windows, curiosamente, puede usar ‘ taskkill ‘.

Desafortunadamente desafortunadamente

Me encontré con el mismo problema que tú. Encontré una solución bastante decente, recomiendo dormir un poco antes de pensar para garantizar que el proceso se haya iniciado oficialmente.

 Process p = Runtime.getRuntime().exec("cmd /c tasklist"); StringWriter writer = new StringWriter(); IOUtils.copy(p.getInputStream(), writer); String theString = writer.toString(); //System.out.println(theString); id = findLastString("javaw.exe .{1,} Console 1", theString); System.out.println(id); 

donde encontrarLastString se define como

 public static String findLastString(String pattern, String in) { Pattern p = Pattern.compile(pattern); Matcher matcher = p.matcher(in); String it= ""; while(matcher.find()) { it = matcher.group(); try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } int firstIndex=pattern.indexOf(".{1,}"); int lastIndex=it.substring(firstIndex).indexOf(pattern.substring(pattern.indexOf(".{1,}")+5))+firstIndex; String dotOn = it.substring(pattern.indexOf(".{1,}")); it=it.substring(firstIndex, lastIndex); return it; } 

Básicamente, esto obtendrá la lista de procesos en ejecución, y encontrará el último ejecutado con, en este caso, el nombre javaw.exe (Mi progtwig estaba comenzando un proceso java por separado). Puede reemplazar javaw.exe con el nombre del proceso, que puede encontrar utilizando el Administrador de tareas. También necesitarás obtener el jar común de IO de Apache.

Creo que en Java su mejor opción es obtener la lista de tareas antes y después de generar el proceso de su hijo. Haz una diferencia y obtén tu PID.

puede obtener la lista de tareas al emitir un Runtime.getRuntime.exec("tasklist");
Tenga en cuenta que tasklist.exe no se incluye con Windows XP Home Edition, pero aún puede descargarlo.