【问题标题】:(Blocking) interactive shell via ProcessBuilder通过 ProcessBuilder 的(阻塞)交互式 shell
【发布时间】:2019-10-30 13:32:46
【问题描述】:

我构建了一个交互式EXE,这意味着你可以不断地向它发送新命令,它会处理它们。

根据this 的回答,可以在Java 中实现这一自动化。但是,在发送命令时,代码不会等到命令完成。相反,它会立即将控制权返回给调用者,这可能会导致race conditions:如果发送的命令应该写入文件,那么文件在被访问之前可能尚未创建。如何发送命令,读取输出,一旦再次需要输入命令,sendCommand() 调用就会返回?

public synchronized void sendCommand(String command) throws IOException
{
    byte[] commandBytes = (command + "\n").getBytes(UTF_8.name());
    outputStream.write(commandBytes);
    outputStream.flush();
}

最好同时返回进程输出。这将是非交互式 shell 命令的默认行为,该命令在完成执行后终止。 read() 无限期地阻塞直到进程终止,我不想硬编码预期进程输出的长度或类似的黑客来规避这个缺点。

【问题讨论】:

  • 好吧,正常的shell在准备好下一个命令时会显示提示...
  • @hyde: 如何使用ProcessBuilder等待提示?
  • 使用终端时如何等待提示?您查看终端上打印的内容。在这种情况下,您需要读取已启动进程写入的内容,并仅在它报告先前已完成后才向其发送新命令。

标签: java processbuilder interactive-shell


【解决方案1】:

我决定再次将我的二进制文件重写为非交互式。事实证明,预期的性能提升可以忽略不计,因此没有更多理由让它保持交互并经历更多的实施麻烦。

【讨论】:

    猜你喜欢
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 2017-06-23
    相关资源
    最近更新 更多