用linux从java读取stdout不起作用

时间:2018-05-29 12:30:03

标签: java linux stdout

我正在尝试从我的简单Linux shellcript中读取stdout

test.sh

#!/bin/bash
echo "I am waiting"
sleep 2s
exit 0 

ShellScriptExecutorTest.java看起来像:

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class ShellScriptExecutorTest {

    public static void main(String[] args) {
        try {
            ProcessBuilder processBuilder = new ProcessBuilder("sudo", "bash", "./test.sh");
            processBuilder.directory(new File("/home/"));
            processBuilder.inheritIO();
            Process process = processBuilder.start();

            InputStream is = process.getInputStream();  
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);  
            String line;  
            while ((line = br.readLine()) != null) {  
              System.out.println("--> " + line);  
            }  

            int exitValue = process.waitFor();
            System.err.println("exitValue: " + exitValue);

        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

如果我执行上面的代码,我会得到:

[root@localhost home]# javac ShellScriptExecutorTest.java
[root@localhost home]# java ShellScriptExecutorTest
I am waiting
exitValue: 0

所以,显然BufferedReader没有读过'否则它写的任何东西

--> I am waiting

在控制台上。

你能搞清楚我的错误吗?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

删除此行

processBuilder.inheritIO();

查看它的作用:

public ProcessBuilder inheritIO()
Sets the source and destination for subprocess standard I/O to be the same as those of the current Java process.

从这里采取java api

这正是您在控制台上看到的内容。 您的子进程的控制台输出是"路由"你的过程。

我不确定你想看到什么?但听起来您希望看到孩子进程的INPUT?

底线是你需要对子进程和流有更基本的了解。