我有这个密码
private static void restartTor() throws IOException, InterruptedException {
String killTor = "killall tor";
String startTor = "/opt/local/bin/tor -f /dev/torrc";
Runtime run = Runtime.getRuntime();
Process pr = run.exec(killTor);
pr.waitFor();
BufferedReader buf = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String line = "";
while ((line=buf.readLine())!=null) {
System.out.println(line);
}
pr = run.exec(startTor);
pr.waitFor();
buf = new BufferedReader(new InputStreamReader(pr.getInputStream()));
line = "";
while ((line=buf.readLine())!=null) {
System.out.println(line);
}
}
当我在计算机a上运行它时,它会按预期执行,但当我在第二台计算机b上运行它时,它会在第二台计算机上卡住 pr.waitFor();
.
我在se上读到了一堆问题,比如process.waitfor()从不返回,java process.waitfor()不返回,主要的问题似乎是您不读取缓冲区,但我是这样做的(不是吗?)。
a和b类似,但不完全相同(Mac,运行10.15,a有32 gb ram,b有16 gb ram)。
我使用相同版本的tor和torrc:s are a和b上相同。
我被难住了。这里有什么问题?
edit:在b上,如果我手动地从一个常规终端终止进程,它会返回,一切都会按预期继续。
编辑2:现在它在计算机上也失败了。我已经在那里运行了几十次,以前没有问题,但现在它不断失败。
2条答案
按热度按时间fcg9iug31#
我不知道这是否是你问题的最终原因,但你应该打电话给我
waitFor
从外部进程读取输出(和错误)之后。如果进程对其标准输出和错误流的写入量超过操作系统准备缓冲的量,则代码可能会死锁:尝试写入输出时,外部进程被阻止
java代码在等待外部进程退出时被阻止。
flmtquvp2#
如果在上遇到流死锁问题,则需要同时使用这两个流
waitFor()
. 你可以在后台线程上完成pr.getErrorStream()
,或在调用前设置stderr处理waitFor()
.要做到这一点,请使用
Runtime.exec
使用processbuilder。将错误日志发送到文件会更容易:
... 或者直接重定向错误以将其与标准输出合并:
然后