2010-06-17 16 views
6

Ich versuche, einen Shell-Befehl von einer Java-Anwendung auf der GNU/Linux-Plattform auszuführen. Das Problem ist, dass das Skript, das eine andere Java-Anwendung aufruft, nie endet, obwohl es erfolgreich von bash ausgeführt wird. Ich habe versucht, es zu debuggen:Ausführen von Shell-Befehlen von 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() 

ich versuchte mit: ProcessBuilder(); und Runtime.getRuntime(). exec (cmd);

Sieht aus wie es wartet auf etwas zu beenden. Irgendwelche Ideen?

Danke, Laurenţiu

+0

Wollen Sie damit sagen, dass das zweite Java-Programm schnell beenden erwartet, aber die Schale noch hängt Aufruf um? Haben Sie bestätigt, dass der zweite Java-Prozess tatsächlich beendet ist (checking process listing)? –

+0

Ja, ich habe die Prozessliste überprüft und der Prozess ist immer noch da. Ich denke, dass dsmith meine Frage beantwortet hat. –

+0

Sieht aus wie die Process-Klasse von Java ist schrecklich langsam. Ich startete die Java-Anwendung von der Shell mit (nicht ausführlichen) Produktionsparametern und es endete nach einer Weile. –

Antwort

13

verarbeiten Sie die Standardeingabe und die Standardausgabe? Vom javadocs:

Da einige nativen Plattformen nur begrenzte Puffergröße für Standard-Eingangs- und Ausgangsströme liefern, das Versagen des sofort den Eingangsstrom zu schreiben oder den Ausgangsstrom des subprocess lesen kann den subprocess verursachen zu blockieren und sogar Sackgasse.

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

Danke, das hat mein Problem gelöst ;-). Nächstes Mal sollte ich die Dokumentation genauer lesen. –