породите терминал, читая его stdin

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

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

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

Таким образом, самый легкий путь состоял бы в том, чтобы смочь открыть xterm (P2), который показывает все, что прибывает в его stdin в его окне, и запустите поток Java, делающий в цикле err.read (P1)-> in.write (P2) к transfert все от stderr (P1) к stdin (P2).
Другая опция состояла бы в том, чтобы смочь запустить что-то как "xterm-e P1_command" и все еще смочь получить P1 stdout...

Большое спасибо за Вашу справку!

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

1
задан Goulou 2 August 2010 в 09:21
поделиться

1 ответ

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

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

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

runProgram 2>/tmp/myoutput.$$

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

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

ИЗМЕНИТЬ :
Я полагаю, что наиболее распространенный способ - выгрузить информацию в файл журнала, и tail это, примерно так:

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

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

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

2
ответ дан 2 September 2019 в 22:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: