Java Process Builder成功地建立了进程,但在刷新信息时返回Stream closed(java.ioException)。

0 人关注

操作系统。Linux(java程序在docker容器中运行)

Java版本:1.8

Node version: 10.22.1

我试图用java ProcessBuilder类从一个可执行的js文件中创建一个进程,如下所示。

String command = "/node/app/bin/app.js"
final ProcessBuilder pb = new ProcessBuilder(command);
Process process = pb.start();
OutputStream out = process.getOutputStream();
 out.write("\n[:--:]".getBytes());
out.flush();// this line throws the error java.io.IOException: Stream closed

运行pb.start()后,进程被成功创建,下面是调试信息。

问题出在out.flush()命令的执行上,它抛出了一个异常。以下是执行错误。

Caused by: java.io.IOException: Stream closed
at java.lang.ProcessBuilder$NullOutputStream.write(ProcessBuilder.java:433) ~[?:1.8.0_292]
at java.io.OutputStream.write(OutputStream.java:116) ~[?:1.8.0_292]
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82) ~[?:1.8.0_292]
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140) ~[?:1.8.0_292]

The /node/app/bin/app.js content is like below:

#!/usr/bin/env node
var path = require('path');
var apJsFile = path.resolve(__dirname, '../app.js'); //app.js is working correctly
require(appJsFile);
    
2 个评论
Try redirecting the process input explicitly: pb.redirectInput(Redirect.PIPE) .
我在 final ProcessBuilder pb = new ProcessBuilder(command) 之后添加了 pb.redirectInput(Redirect.PIPE) ,但仍然继续抛出同样的错误。
java
linux
process
Rando Shtishi
Rando Shtishi
发布于 2022-07-13
2 个回答
DuncG
DuncG
发布于 2022-07-14
已采纳
0 人赞同

你的子进程很可能在向子进程的stdin写东西时报错并退出 getOutputStream() 。- 因此流被关闭。由于你没有正确地消耗stdout和stderr流,你还没有机会阅读任何错误信息。

一个简单的检查方法是将stdout和stderr重定向到一个文件,以便事后检查。

pb.redirectOutput(new File("std.out"));          
pb.redirectError(new File("std.err"));
Process process = pb.start();
int rc = p.waitFor();