waitfor()在我的一台计算机上返回一个,但在我的另一台计算机上不返回

n9vozmp4  于 2021-07-05  发布在  Java
关注(0)|答案(2)|浏览(388)

我有这个密码

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:现在它在计算机上也失败了。我已经在那里运行了几十次,以前没有问题,但现在它不断失败。

fcg9iug3

fcg9iug31#

我不知道这是否是你问题的最终原因,但你应该打电话给我 waitFor 从外部进程读取输出(和错误)之后。如果进程对其标准输出和错误流的写入量超过操作系统准备缓冲的量,则代码可能会死锁:
尝试写入输出时,外部进程被阻止
java代码在等待外部进程退出时被阻止。

flmtquvp

flmtquvp2#

如果在上遇到流死锁问题,则需要同时使用这两个流 waitFor() . 你可以在后台线程上完成 pr.getErrorStream() ,或在调用前设置stderr处理 waitFor() .
要做到这一点,请使用 Runtime.exec 使用processbuilder。

ProcessBuilder pb = new ProcessBuilder(startTor);

将错误日志发送到文件会更容易:

File stderr = new File("stderr.log");
pb.redirectError(stderr));

... 或者直接重定向错误以将其与标准输出合并:

pb.redirectErrorStream(true);

然后

pr = pb.start();
pr.waitFor();

相关问题