【问题标题】:Executing shell commands from Java从 Java 执行 shell 命令
【发布时间】:2011-03-04 23:42:43
【问题描述】:

我正在尝试在 GNU/Linux 平台上从 java 应用程序执行 shell 命令。问题是调用另一个 java 应用程序的脚本永远不会结束,尽管它从 bash 成功运行。我尝试调试它:

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

我尝试过:ProcessBuilder();和 Runtime.getRuntime().exec(cmd);

看起来它在等待某事完成。有什么想法吗?

谢谢, 劳伦修

【问题讨论】:

  • 您是说第二个 Java 程序预计会很快完成,但调用它的 shell 仍然挂起?您是否确认第二个 Java 进程实际上已经完成(检查进程列表)?
  • 看起来 Java 中的 Process 类非常慢。我使用生产(非详细)参数从 shell 启动了 java 应用程序,并在一段时间后完成。
  • 是的,我检查了进程列表,进程仍然存在。我认为 dsmith 回答了我的问题。

标签: java shell command-line


【解决方案1】:

你在处理标准输入和标准输出吗?来自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();

【讨论】:

  • 谢谢,这解决了我的问题 ;-)。下次我应该更仔细地阅读文档。