0

我正在尝试在我自己的控制台窗口中运行 plink。我从使用 Process.exec() 开始,效果很好。我开始使用 ProcessBuilder,现在在我终止进程之前不会发送输出。

我的代码如下所示:

    class ConsoleOutputThread extends Thread {

    public void start(String processName) {
        // this was old code: Runtime r = Runtime.getRuntime();
        try {
            builder = new ProcessBuilder("plink", "-ssh", "192.168.3.21");
            builder.redirectErrorStream(true);
            process = builder.start();
            //this was old code: process = r.exec (processName);
        } catch (IOException ex) {
        }
        start();
    }

    @Override
    public void run() {
        try {
            BufferedReader is = new BufferedReader(new InputStreamReader(process.getInputStream()));
            writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
            try {
                process.waitFor();
            } catch (InterruptedException ex) {
            }
            char    b[];
            b = new char[1];
            while(is.read(b, 0, 1)> 0) {
                // this is for debug, normally sent to console
                System.out.println("Got character: " + b[0]);
            }
        } catch (IOException ex) {
        }
    }
}

因此,当使用 Runtime.exec() 时一切正常。现在,使用 ProcessBuilder,读取功能将永远阻塞(实际上直到我终止进程,当一切都被吐出时)。但是,错误流有效,即如果我输入错误选项,我会在控制台中收到消息。我可能在这里遗漏了一些东西并寻求帮助。谢谢

4

1 回答 1

0

您已将plink进程设置为将其输出写入连接到 java 进程的管道。该进程的任何输出plink都将保存在操作系统缓冲区中,直到您的进程读取它为止。操作系统缓冲区的容量有限,如果plink写入太多数据,它将阻塞,直到您的进程从缓冲区中读取一些数据。

不幸的是,java 进程在从管道读取任何内容之前等待plink进程完成。因此,如果plink进程写入过多的输出,它将无限期地阻塞。

plink您应该在调用之前更改 java 逻辑以读取进程的输出waitfor()

于 2013-09-26T15:32:41.930 回答