我有一个像这样开始的流程:
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是否可能已关闭,而它仍在写入?并且它被写入文件?
答案 0 :(得分:1)
输入流被缓冲。您从缓冲区读取数据,这些数据是在进程被杀死之前编写的。