我正在尝试在GNU / Linux平台上从Java应用程序执行shell命令。问题是调用另一个java应用程序的脚本永远不会结束,尽管它从bash成功运行。我试着调试它:
(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 ()
我尝试过:ProcessBuilder();和Runtime.getRuntime()。exec(cmd);
看起来它等待完成任务。有什么想法吗?
谢谢, Laurenţiu
答案 0 :(得分:15)
您在处理标准输入和标准输出吗?来自javadocs:
由于某些本机平台仅为标准输入和输出流提供有限的缓冲区大小,因此无法及时写入输入流或读取子进程的输出流可能导致子进程阻塞,甚至死锁。
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();