2010-06-17 27 views
6

Estoy tratando de ejecutar un comando de shell desde una aplicación java, en la plataforma GNU/Linux. El problema es que el script, que llama a otra aplicación Java, nunca termina, aunque se ejecuta correctamente desde bash. Intenté depurarlo:Ejecutando comandos de shell desde Java

 
(gdb) bt 
#0 0xb773d422 in __kernel_vsyscall() 
#1 0xb7709b5d in pthread_join (threadid=3063909232, thread_return=0xbf9cb678) at pthread_join.c:89 
#2 0x0804dd78 in ContinueInNewThread() 
#3 0x080497f6 in main() 

He intentado con: ProcessBuilder(); y Runtime.getRuntime(). exec (cmd);

Parece que espera a que termine algo. ¿Algunas ideas?

Gracias, Laurenţiu

+0

¿Quiere decir que se espera que el segundo programa Java para terminar rápidamente, pero la cáscara que lo alega, todavía cuelga alrededor? ¿Has confirmado que el segundo proceso de Java está realmente terminado (listado del proceso de cheking)? –

+0

Sí, verifiqué la lista de procesos y el proceso todavía está allí. Creo que Dsmith respondió mi pregunta. –

+0

Parece que la clase Process de Java es terriblemente lenta. Inicié la aplicación java desde el shell con parámetros de producción (no detallados) y finalizó después de un tiempo. –

Respuesta

13

¿Usted está procesando la entrada estándar y salida estándar? Desde el javadocs:

Debido a que algunas plataformas nativas sólo proporcionan tamaño del búfer limitado para los flujos de entrada y salida estándar, el hecho de escribir rápidamente el flujo de entrada o leer el flujo de salida del subproceso puede hacer que el subproceso de bloquear, e incluso punto muerto.

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


BufferedReader stdoutReader = new BufferedReader(
     new InputStreamReader(cmdProc.getInputStream())); 
String line; 
while ((line = stdoutReader.readLine()) != null) { 
    // process procs standard output here 
} 

BufferedReader stderrReader = new BufferedReader(
     new InputStreamReader(cmdProc.getErrorStream())); 
while ((line = stderrReader.readLine()) != null) { 
    // process procs standard error here 
} 

int retValue = cmdProc.exitValue(); 
+0

Gracias, esto resolvió mi problema ;-). La próxima vez debería leer la documentación con más cuidado. –

Cuestiones relacionadas