如何在 ubuntu shell (WSL) 上从 Windows 上的 Java 启动外部程序



我在Windows上,我尝试在编写用于Linux操作系统的Java应用程序上工作,因为该程序会在某个时候启动一些shell脚本。

我有WSL(Linux的Windows子系统,也称为Ubuntu bash),所以执行shell脚本应该不是问题,但是我有一个错误:0x80070057

启动外部进程的代码:

public Process startProcess(List<String> commands ) throws IOException {
ProcessBuilder etProcessBuilder= new ProcessBuilder(commands);
Process etProcess = etProcessBuilder.start();
ProcessOutputReader stdReader= new ProcessOutputReader(etProcess.getInputStream(), LOGGER::info);
ProcessOutputReader errReader= new ProcessOutputReader(etProcess.getErrorStream(), LOGGER::error);
new Thread(stdReader).start();
new Thread(errReader).start();
return etProcess;
}

命令参数是用这样的内容设置的:

  • "/mnt/d/some/path/scripts/initEAF.sh"
  • "-argForTheScript"
  • "一些价值"
  • "-另一个Arg"
  • "其他价值">

我还尝试添加"bash.exe"作为第一个命令,但它似乎不起作用。

ProcessOutputReader是一个类,用于记录进程中的流

class ProcessOutputReader implements Runnable {
private final InputStream inputStream;
private Consumer<String> loggingFunction;
ProcessOutputReader(InputStream inputStream, Consumer<String> loggingFunction) {
this.inputStream = inputStream;
this.loggingFunction = loggingFunction;
}
private BufferedReader getBufferedReader(InputStream is) {
return new BufferedReader(new InputStreamReader(is));
}
@Override
public void run() {
BufferedReader br = getBufferedReader(inputStream);
String ligne;
try {
while ((ligne = br.readLine()) != null) {
loggingFunction.accept(ligne);
}
} catch (IOException e) {
LOGGER.error("Error occur while reading the output of process ", e);
}
}
}

欢迎任何想法。

*.sh 不是可执行文件。 你需要通过 shell 运行它,例如bash xxx.sh -argssh xxx.sh -args如果你的 java 应用程序在 wsl 中运行。

如果你的Java应用程序在Windows上运行,它应该是bash.exe -c xxx.sh

最新更新