powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Перенаправление потоков вывода нескольких процессов в один поток.
11 сообщений из 11, страница 1 из 1
Перенаправление потоков вывода нескольких процессов в один поток.
    #38820564
feomatr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача:
Производим запуск нескольких процессов.. каждый из них может либо выполняться какое-то небольшое время(1, 10, 60 секунд), либо работать в качестве демона(30 минут)..
У процессов получаю InputStream и ErrorInputStream.. Хотелось бы выводить это добро в один поток.
Как всё "синхронизировать"?
То есть как произвести "Перенаправление потоков вывода нескольких процессов в один поток." ?

Сейчас есть код(метод), который запускает один процесс:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
    	ProcessBuilder pb = new ProcessBuilder(scriptName, arguments);
    Map<String, String> env = pb.environment();
    pb.directory(new File(pDir));
    Process p = pb.start();
    p.getErrorStream();
     
    try {
    Thread.sleep(2000l);
    } catch (InterruptedException e) {
    log.error("", e);
     
    }
    // todo Create Service Which can read From InputStream and ErrorStream... Console Output ?
    BufferedInputStream bis = new BufferedInputStream(p.getInputStream());
    InputStreamReader reader = new InputStreamReader(bis);
    BufferedReader bufferedReader = new BufferedReader(reader);
    for (; bufferedReader.ready(); ) {
    log.error("info: " + bufferedReader.readLine());
    // System.out.println("info: "+ bufferedReader.readLine());
    }
     
    bis = new BufferedInputStream(p.getErrorStream());
    reader = new InputStreamReader(bis);
    bufferedReader = new BufferedReader(reader);
    for (; bufferedReader.ready(); ) {
    log.error("errors: " + bufferedReader.readLine());
    // System.out.println("errors: "+ bufferedReader.readLine());
    }
...
Рейтинг: 0 / 0
Перенаправление потоков вывода нескольких процессов в один поток.
    #38820658
YamahaR1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
feomatr,

Вот тут посмотрите, если я вас правильно понял:

http://stackoverflow.com/questions/14165517/processbuilder-forwarding-stdout-and-stderr-of-started-processes-without-blocki
...
Рейтинг: 0 / 0
Перенаправление потоков вывода нескольких процессов в один поток.
    #38820681
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
feomatr ,
Единственное возможное решение - стартовать отдельный поток для каждого процесса, где читать из out/err стримов этого процесса.
inheritIO - в общем случае вариант нерабочий, так как он будет загаживать стримы вашего процесса, хотите вы этого или нет. Как стартовать отдельный поток для процесса - дело ваше. Можно руками, это пару десятков строк кода. Можно какую-нибудь утилитарную библиотеку подключить.
...
Рейтинг: 0 / 0
Перенаправление потоков вывода нескольких процессов в один поток.
    #38821036
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoach feomatr ,
Единственное возможное решение - стартовать отдельный поток для каждого процесса, где читать из out/err стримов этого процесса.
inheritIO - в общем случае вариант нерабочий, так как он будет загаживать стримы вашего процесса, хотите вы этого или нет. Как стартовать отдельный поток для процесса - дело ваше. Можно руками, это пару десятков строк кода. Можно какую-нибудь утилитарную библиотеку подключить.

Вроде уже не обязательно потоки плодить?
http://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html#redirect-input
...
Рейтинг: 0 / 0
Перенаправление потоков вывода нескольких процессов в один поток.
    #38821298
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если взять очередь - тогда у вас появиться много писателей - подписчиков ..и один читатель , который будет эту очередь разбирать ...по мере поступления данных ? такой вариант подойдет?
...
Рейтинг: 0 / 0
Перенаправление потоков вывода нескольких процессов в один поток.
    #38821774
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может свой класс от какого нибудь InputStream породить и его методы тупо засинхронизировать? И перед один и тот же thread-safe экземпляр во все процессы?

p.s. возможно чушь сморозил, не проверял.
...
Рейтинг: 0 / 0
Перенаправление потоков вывода нескольких процессов в один поток.
    #38821822
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoachЕдинственное возможное решение - стартовать отдельный поток для каждого процесса, где читать из out/err стримов этого процесса.+1
...
Рейтинг: 0 / 0
Перенаправление потоков вывода нескольких процессов в один поток.
    #38822062
feomatr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В принципе, мне подходит создание отдельного треда на потоки процесса.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(), "ERROR");

// any output?
StreamGobbler outputGobbler = new StreamGobbler(p.getInputStream(), "OUTPUT");

// start gobblers
outputGobbler.start();
errorGobbler.start();


private class StreamGobbler extends Thread {
    InputStream is;
    String type;

    private StreamGobbler(InputStream is, String type) {
        this.is = is;
        this.type = type;
    }

    @Override
    public void run() {
        try {
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            while ((line = br.readLine()) != null)
                System.out.println(type + "> " + line);
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}



Ещё, потоки будут маркироваться, "Процесс Х, Еррор: ", а не просто сваливаться в одну кучу.
Потому, вместо
Код: java
1.
System.out.println(type + "> " + line);


, осталось сделать структуру и\или методы доступа к ней для записи данных Тредами.
...
Рейтинг: 0 / 0
Перенаправление потоков вывода нескольких процессов в один поток.
    #38822169
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
feomatr,

Java Doc не пробовали читать? Redirect Error в Output доступен уже с Java 6.
...
Рейтинг: 0 / 0
Перенаправление потоков вывода нескольких процессов в один поток.
    #38823093
feomatr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Сейчас внимательно перечитал ссылку, приведенную вами ранее.
Из прочитанного понял, что : при редиректе error в output, нет возможности написать "это ОШИБКИ из процесса PROCESS ". То есть, Не могу маркировать, стримы названиями процесса!

Что-то вроде:
запуск процессов, как последовательно, так и параллельно, чтобы output && error выводились в одну "консоль" с пометкой: процесс Х, цвет отображения COLOR. Консоль, получив как стримы, так и сопровождающую информацию отобразит разноцветный текст.
...
Рейтинг: 0 / 0
Перенаправление потоков вывода нескольких процессов в один поток.
    #38823241
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
feomatrСейчас внимательно перечитал ссылку, приведенную вами ранее.

Похоже что не внимательно.
Вы привели код, в котором отдельно читаете output и error. Он не нужен. Это не решает вопроса с процессами. Это решает вопрос в том что отдельно output и error обрабатывать не обязательно. Можно всё слить в output и читать только его.
А процессы это отдельный вопрос. Я бы не занимался ерундой и сливал бы всё в разные файлы. А файлы потом уже можно комбинировать как душе угодно.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Перенаправление потоков вывода нескольких процессов в один поток.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]