完成后的流程写作?

时间:2013-04-15 16:55:03

标签: java process java.util.scanner

我有一个像这样开始的流程:

Process process = new ProcessBuilder("sh", "-c", "mongod | tee /tmp/logfile.txt");

这个过程,当它被中断时,优雅地结束,写入输出流“dbexit:真的现在退出”

所以后来,我想杀了它:

InputStream inputStream = process.getInputStream()
Scanner scanner = new Scanner(inputStream).useDelimiter(Pattern.quote("dbexit: really exiting now"));
//pid taken from grep
Shell.runShellCommand("kill -2 " + pid).waitFor();
scanner.next()

始终在我的计算机上成功运行。但几乎从不在CI服务器上。 scanner.next()抛出:

java.util.NoSuchElementException: null
    at java.util.Scanner.throwFor(Scanner.java:838)
    at java.util.Scanner.next(Scanner.java:1347)

所以看起来这个过程在写“dbexit:now now now now”之前就已经结束了(或者至少关闭了它的InputStream)。但是这个文本出现在/tmp/logfile.txt的末尾。进程InputStream是否可能已关闭,而它仍在写入?并且它被写入文件?

1 个答案:

答案 0 :(得分:1)

输入流被缓冲。您从缓冲区读取数据,这些数据是在进程被杀死之前编写的。