2010-06-17 19 views
6

Sto provando ad eseguire un comando shell da un'applicazione java, sulla piattaforma GNU/Linux. Il problema è che lo script, che chiama un'altra applicazione java, non finisce mai, sebbene venga eseguito correttamente da bash. Ho provato a eseguire il debug:Esecuzione comandi shell da 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() 

Ho provato con: ProcessBuilder(); e Runtime.getRuntime(). exec (cmd);

Sembra che aspetti che qualcosa finisca. Qualche idea?

Grazie, Laurenţiu

+0

Sta dicendo che il secondo programma Java si prevede di finire in fretta, ma il guscio invoca ancora si aggira? Hai confermato che il secondo processo Java è effettivamente terminato (lista dei processi di cheking)? –

+0

Sì Ho controllato l'elenco dei processi e il processo è ancora lì. Penso che dsmith abbia risposto alla mia domanda. –

+0

Sembra che la classe Process di Java sia terribilmente lenta. Ho avviato l'applicazione java dalla shell con parametri di produzione (non dettagliati) e l'ho terminata dopo un po '. –

risposta

13

State elaborando lo standard input e output standard? Dalla javadocs:

Poiché alcune piattaforme native forniscono soltanto formato buffer limitato per i flussi di ingresso e di uscita standard, mancata per scrivere prontamente flusso in entrata o leggere il flusso di uscita del sottoprocesso può causare il sottoprocesso bloccare e persino deadlock.

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

Grazie, questo ha risolto il mio problema ;-). La prossima volta dovrei leggere la documentazione con più attenzione. –

Problemi correlati