(阻塞)交互式 shell 通过 ProcessBuilder
(Blocking) interactive shell via ProcessBuilder
我构建了一个交互式 EXE
,这意味着您可以不断向它发送新命令,它会处理它们。
根据 this 的回答,可以在 Java
中实现自动化。但是,发送命令时,代码不会等到命令完成。相反,它会 return 立即将控制权返回给调用者,这可能会导致 race conditions
:如果发送的命令应该写入文件,则可能在访问文件之前尚未创建该文件.如何发送命令、读取输出以及再次预期输入命令时,sendCommand()
调用 returns?
public synchronized void sendCommand(String command) throws IOException
{
byte[] commandBytes = (command + "\n").getBytes(UTF_8.name());
outputStream.write(commandBytes);
outputStream.flush();
}
最好同时 return处理过程输出。这将是非交互式 shell 命令的默认行为,该命令在完成执行后终止。 read()
无限期阻塞,直到进程终止,我不想硬编码预期进程输出的长度或类似的 hack 来规避这个缺点。
我决定再次将我的二进制文件重写为 non-interactive。事实证明,预期的性能提升可以忽略不计,因此没有更多理由让它保持交互并增加实施麻烦。
我构建了一个交互式 EXE
,这意味着您可以不断向它发送新命令,它会处理它们。
根据 this 的回答,可以在 Java
中实现自动化。但是,发送命令时,代码不会等到命令完成。相反,它会 return 立即将控制权返回给调用者,这可能会导致 race conditions
:如果发送的命令应该写入文件,则可能在访问文件之前尚未创建该文件.如何发送命令、读取输出以及再次预期输入命令时,sendCommand()
调用 returns?
public synchronized void sendCommand(String command) throws IOException
{
byte[] commandBytes = (command + "\n").getBytes(UTF_8.name());
outputStream.write(commandBytes);
outputStream.flush();
}
最好同时 return处理过程输出。这将是非交互式 shell 命令的默认行为,该命令在完成执行后终止。 read()
无限期阻塞,直到进程终止,我不想硬编码预期进程输出的长度或类似的 hack 来规避这个缺点。
我决定再次将我的二进制文件重写为 non-interactive。事实证明,预期的性能提升可以忽略不计,因此没有更多理由让它保持交互并增加实施麻烦。