2009-12-13 12 views
12

estoy creando subprocesos de esta manera:Identificación del subproceso en Java

String command = new String("some_program"); 

Process p = Runtime.getRuntime().exec(command); 

¿Cómo puedo conseguir que el subproceso ID?

P.S. Estoy trabajando en Linux.

+0

cadena commend = "some_program" es mejor en este caso – pstanton

+0

No es el código real. Solo un fragmento para describir el problema. – Pawka

Respuesta

27

Todavía existe ninguna API pública para esto (ver http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4244896), pero hay soluciones.

Una primera solución sería utilizar un programa externo como ps y llamarlo usando Runtime.exec() para obtener el pid :)

Otra se basa en el hecho de que la clase java.lang.Process es abstracta y que en realidad se consigue una subclase concreta según su plataforma. En Linux, obtendrá un java.lang.UnixProcess que tiene un campo privado int pid. El uso de la reflexión, se puede obtener fácilmente el valor de este campo:

Field f = p.getClass().getDeclaredField("pid"); 
f.setAccessible(true); 
System.out.println(f.get(p)); 
+0

nice .. Me pregunto por qué esto no es público? – Bozho

+0

¡Buena pregunta! Y me pregunto por qué ese error está abierto por más de 10 años sin resolución. –

+3

Probablemente porque Sun quiere que te quedes dentro de la JVM. –

1

Intenté (y fallé) hacer esto hace un tiempo. Terminé envolviendo mi comando en un script de shell que arrojó el pid a un archivo. No es la mejor solución, pero me permitió superar este obstáculo.

+0

Esta fue la primera idea, lo que pensé. Pero no me queda bien El "comando" podría ser casi cualquier programa, no preparado por mi. Thx de todos modos. – Pawka

1

bien no hay manera documentada para hacer esto, pero sucede que la clase de implementación de procesos es UNIXProcess, y tiene un campo PID. Entonces, podría usar la reflexión para acceder a este campo privado para obtener la ID. Buscar en Google a su alrededor encontrará otros trucos para llamar a otro intérprete de comandos para obtener resultados de ps y ese tipo de cosas. Nada fácil

1

De here

public static void main(String[] args) throws IOException { 
    byte[] bo = new byte[100]; 
    String[] cmd = {"bash", "-c", "echo $PPID"}; 
    Process p = Runtime.getRuntime().exec(cmd); 
    p.getInputStream().read(bo); 
    System.out.println(new String(bo)); 
} 
+0

He encontrado esa publicación antes, pero no me queda. No puedo prepararme para modificar el programa del subproceso que generaría el PID. – Pawka

Cuestiones relacionadas