Java - 运行子进程在本地工作,但在 Heroku 上运行时失败并"broken pipe"?



作为背景,我在Heroku上部署了一个基于Java的Discord机器人,使用1个免费的worker dyno。我需要运行一个.exe文件(stockfish 12可执行文件(,将输入传递给它,并处理它的输出。我使用Java RunTime创建这个进程,但当我试图用flush((方法向它发送输入时,会引发管道破裂错误。我认为Heroku一定以某种方式关闭了输入/输出流,因为这段代码在本地运行得很好。Heroku对创建子流程有限制吗?

app[worker.1]:ches.player.ai.stockfish.exception.StockfishEngineException:java.io.io异常:管道破裂app[worker.1]:在chess.player.ai.stockfish.engine.UCIngine.sendCommand(UCIEngine.java:39(app[worker.1]:在chess.player.ai.stockfish.engine.UCIngine.passOption(UCIEngine.java:77(app[worker.1]:在国际象棋.棋手.ai.stockfish.引擎.UCIEngine。(UCIEngine.java:23(app[worker.1]:在国际象棋。玩家。ai。stockfish。引擎。stockfish。(stockfish.java:13(app[worker.1]:在国际象棋上。player.ai。stockfish.StockFishClient。(StockFishClient.java:21(app[worker.1]:在国际象棋.玩家.ai.stockfish.StockFishClient$Builder.build(StockFishClient.java:80(

编辑:我试图通过硬编码一个命令来简化程序,但它仍然无法通过writter.flush((行。没有打印任何内容。

Process process = new ProcessBuilder().command("bin/stockfish_20090216_x64_bmi2.exe").start();
StringBuilder output = new StringBuilder();
BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
writer.write("position fen rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1" + "n");
writer.write("go movetime 1000");
writer.flush();
String line;
while ((line = input.readLine()) != null) {
output.append(line + "n");
}
int exitVal = process.waitFor();
if (exitVal == 0) {
System.out.println("success");
System.out.println(output.toString());
}
else {
System.out.println("error");
}

output流关闭自身。运行命令时,创建一个新进程,或者此命令必须阻塞流并等待输入。

推荐ProcessBuilder,它更容易配置:

new ProcessBuilder().command("cmd.exe", "/c", "command")
.directory(new File(path))
.redirectInput(new File(path, "input.txt"))
.redirectOutput(new File(path, "output.txt"))
.redirectError(new File(path, "runtime_error.txt"))
.start()
.waitFor();

原来我使用了错误的二进制文件。Stockfish二进制文件有很多不同的格式,显然适用于我的本地文件的格式在Heroku上不起作用。

相关内容

最新更新