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

时间:2017-09-22 14:46:27

标签: java windows-subsystem-for-linux

我在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”
  • “有些价值”
  • “ -​​ anotherArg”
  • “其他价值”

我还尝试添加“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);
        }
    }
}

欢迎任何想法。

1 个答案:

答案 0 :(得分:0)

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

如果您的Java应用在Windows上运行,则应为bash.exe -c xxx.sh