Чтение стандартного вывода с Java из Linux не работает - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь прочитать stdout из моего простого сценария Linux.

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 голосов
/ 29 мая 2018

Удалить эту строку

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

И этоименно то, что вы видите на своей консоли.Консольный вывод вашего дочернего процесса «перенаправлен» на ваш процесс.

Я не уверен, что вы хотели бы видеть?Но звучит так, как будто вы хотели бы видеть ВХОД вашего дочернего процесса?

Суть в том, что вам нужно получить более общее представление о дочерних процессах и потоках.

...