спавн терминал, читающий свой стандарт - PullRequest
1 голос
/ 02 августа 2010

Я пишу (под Linux или Windows + Cygwin) Java-программу, которая должна запустить команду (процесс P1) и прочитать ее стандартный вывод (который в основном представляет собой двоичные данные, полезные для моей программы). Это легко сделать, и уже сделано.

Проблема в том, что P1 также печатает некоторую информацию о состоянии на stderr, и я хотел бы вызвать терминал (например, xterm), чтобы показать его в удобочитаемом виде. Есть ли простой способ сделать это?

Я рассмотрел вариант простого ввода некоторой JTextArea с выводом stderr, но эта программа использует специальные управляющие символы (в частности, стирает последнюю строку). К сожалению, я не смог найти "Terminal (J) Component" в свободном доступе.

Таким образом, самый простой способ - это открыть xterm (P2), который показывает все, что приходит на его стандартный ввод в своем окне, и запустить поток Java, выполнив цикл err.read (P1) -> in.write. (P2) для передачи всего из stderr (P1) в стандартный ввод (P2).
Другой вариант - запускать что-то вроде «xterm -e P1_command» и по-прежнему иметь возможность захватывать стандартный вывод P1 ...

Большое спасибо за помощь!

PS: Я хотел бы остаться максимально переносимым, поэтому я не уверен, что заходить в / dev / pts - хорошая идея

1 Ответ

2 голосов
/ 02 августа 2010

Без полного понимания вашей проблемы самое простое решение, которое я могу придумать, - это следующее (bash заменит $$ на текущий идентификатор процесса, сделав его полууникальным).Я также понятия не имею, работает ли это в cygwin.

mkfifo /tmp/myoutput.$$
trap "rm /tmp/myoutput.$$" EXIT

xterm -e cat /tmp/myoutput.$$ &

runProgram 2>/tmp/myoutput.$$

Это сбросит stderr в fifo, который читается cat в вашем xterm.

Обратите внимание, что cat будет выходить всякий раз, когдавы закрываете fifo, поэтому, если вы порождаете несколько экземпляров своего процесса, вам понадобится какой-то другой механизм управления, а затем, возможно, есть другие способы его решения, более простые.Например, запустить весь процесс в xterm с самого начала (включая вашу Java-программу), но я думаю, что по какой-то причине это невозможно, иначе вы бы уже попробовали.

РЕДАКТИРОВАТЬ :
Полагаю, наиболее распространенный способ - сбросить информацию в файл журнала, и tail это, например, так:

touch /tmp/myprogram.log
xterm -e tail -f /tmp/myprogram.log &
runProgram 2>/tmp/myprogram.log

Это всегда должно работать, но вы можете потерять сообщения журнала, если tailзапускается слишком медленно (ищите флаги в хвосте, чтобы отобразить весь файл перед хвостом).Добавьте к этому ловушку (и «уникальное» имя файла), чтобы удалить файл, и вам не нужно беспокоиться об очистке.

В чем причина того, что не все приложение запускается в xterm?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...