我有一个 java Restful 服务方法,它使用 processBuilder 执行 myscript.sh。我的脚本采用一个输入(示例 - myscript.sh/path/to-a/folder)。 脚本里面是这样的
-> execute a command which is multithreaded i.e parallel processing
-> echo "my message"
现在,当从 Linux 命令行调用我的脚本时,它执行得很好。首先,所有线程运行完成,然后终端上显示线程命令执行的一些文本输出,然后显示回显我的消息。
但是当我使用 processBuilder 从 java 调用相同的脚本时,最后一条回显消息立即出现并且执行结束。
按照我从 java 调用脚本的方式
ProcessBuilder processBuilder = new ProcessBuilder("/bin/bash","/path/to/myscript.sh","/path/to/folder/data");
Process proc = processBuilder.start();
StringBuffer output = new StringBuffer();
BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = "";
while((line = reader.readLine()) != null){
output.append(line + "\n");
}
System.out.println("### " + output);
我不知道发生了什么,也不知道如何调试。 有人可以告诉我如何在从终端或 java processBuilder 运行时从 shell 脚本获得相同的行为吗?
最佳答案
使用ProcessBuilder.redirectErrorStream(boolean redirectErrorStream)
有参数true
将错误合并到输出中。或者,您也可以使用 shell 命令语法 cmd 2>&1
将错误与输出合并。
在这些情况下,您可能会立即获得最后一个 echo
的输出。语句(而不是脚本花费时间运行并返回正确的结果):
- 缺少环境变量
- 启动的 bash 需要获取 .bashrc 或一些此类资源文件
- 启动的 bash 可能没有在正确的目录中运行(您可以在 ProcessBuilder 中设置)
- 启动的 bash 可能无法在其 PATH 中找到某些脚本/可执行文件
- 启动的 bash 可能无法在任何可执行文件的路径中找到正确的库
合并错误后,您就可以自己调试并查看错误。
关于java - 如何等待多线程 shell 脚本执行完成在我的 Web 服务中调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40627645/