![](/img/trans.png)
[英]Using java.lang.ProcessBuilder to run a shell script on a different host
[英]java ProcessBuilder run shell script is hanging
我正在尝试使用ProcessBuilder运行shell脚本。 该脚本可以工作但不能在java代码之后运行。 并且错误流不输出消息。 我在centOS 6.9计算机上运行它。 请在下面找到我的代码。
public static ArrayList<String> runCommand(ArrayList<String> command)throws IOException {
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command(command);
Process process = processBuilder.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
ArrayList<String> commandOutput = new ArrayList<>();
String str;
while((str = reader.readLine()) != null) {
commandOutput.add(str);
}
StringBuilder errorBuilder = new StringBuilder();
while((str = errorReader.readLine()) != null) {
errorBuilder.append(str);
}
String errorMessage = errorBuilder.toString();
if(!errorMessage.equals("")) {
String message = LOG_TAG + ",[runCommand] error:" + errorMessage;
System.out.println(message);
}
reader.close();
errorReader.close();
process.destroy();
return commandOutput;
}
在您的情况下,您正在从流程的输出流中读取内容,直到您使用所有内容。 然后,您尝试读取错误流。
如果进程在错误流上写入了相当多的字符,则另一个进程将阻塞直到它们被占用。 要同时使用错误流和输出流,您需要使用线程。
您可以遵循StreamGobbler
技术。 您可以从该页面获得一些详细信息: https : //www.javaworld.com/article/2071275/when-runtime-exec---won-t.html? page = 2
这是一些受页面影响的代码:
public class StreamGobbler extends Thread {
private static final String EOL = System.lineSeparator();
private final InputStream inputStream;
private final StringBuilder output = new StringBuilder();
public StreamGobbler(InputStream inputStream) {
this.inputStream = inputStream;
}
public void run() {
try (InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader reader = new BufferedReader(inputStreamReader);
) {
String line;
while ((line = reader.readLine()) != null) {
output.append(line);
output.append(EOL);
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
public String getOutput() {
return output.toString();
}
}
在您的代码中,您使用StreamGobbler
如下所示:
StreamGobbler outputGobbler = new StreamGobbler(process.getInputStream());
StreamGobbler errorGobbler = new StreamGobbler(process.getErrorStream());
process.waitFor();
String commandOutput = outputGobbler.getOutput();
String errorMessage = errorGobbler.getOutput();
process.destroy();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.