Страницы

Поиск по вопросам

понедельник, 20 мая 2019 г.

Перенаправление стандартного потока вывода процессу в другом терминале

Надо перенаправить поток вывода какой-нибудь команды процессу в другом терминале, например cat. В свою очередь, он должен перенаправить свой вывод в следующий терминал. Пути решения нашел, например, здесь
Пробую. Запускаю процесс:
~$ tty /dev/pty1 ~$ cat > /dev/pty2
Посылаю сообщение:
~$ tty /dev/pty0 ~$ echo "Hi from $(tty)" > /dev/pty1
Но моё сообщение я вижу в первом терминале, а не во втором как ожидал:
~$ tty /dev/pty1 ~$ cat > /dev/pty2 Hi from /dev/pty0
~$ tty /dev/pty2 ~$
Почему второе перенаправление не работает?


Ответ

У меня так: Первый терминал /dev/pts/0, второй - /dev/pts/1
На втором запускаю cat:
# cat < /dev/pts/0
На первом:
# echo “hi” > /dev/pts/1
В результате hi появляется во втором терминале. А в приведенной вами ссылке лучше работать через proc и дескрипторы, так как задача передать вывод процессу, а не просто в терминал.
Update
Все, что написано выше решает только задачу "отобразить вывод в другом терминале" и не решает "перенаправить поток вывода процессу в другом терминале". Соответственно, и никакие дальнейшие передачи (по другим терминалам) не получатся.
Как быть?
Мне кажется проще всего это делать через named-pipe (mkfifo) (через несколько каналов, например). Но если хочется через стандартные редиректы-каналы, то есть вариант написать немного трэша.
Для примера пишем скрипт echo.sh
#!/bin/bash
while read std do echo "$std +" done
и запускаем его в одном из терминалов (например, в /dev/pts/4) следующим образом:
$ cat - | ./echo.sh
В другом терминале (пусть будет /dev/pts/0) ищем pid процесса echo.sh, пусть он равен 23441. И в этом же терминале делаем так:
$ echo "Hi again" > /proc/23441/fd/0
Смотрим результат в терминале /dev/pts/4:
Hi again +
и это означает, что скрипт принял таки вывод с другого терминала и добавил к сообщению "+".
По этой схеме можно передавать в следующий терминал. Возможно есть и более элегантное решение.
Update 2. Три терминала
Сделаем тоже самое с тремя терминалами pts/0, pts/1, pts/2. Сначала делаем копию echo.sh с именем echo2.sh. echo2.sh запускаем в pts/2:
$ cat - | ./echo2.sh
затем идем в pts/1 и находим pid процесса echo2.sh, пусть будет 31677. Теперь в pts/1 запускаем команду:
$ cat - | ./echo.sh | tee >/proc/31677/fd/0 >(cat)
в этой конструкции я использовал tee только ради наглядности примера, чтобы отобразить будущий вывод в данном терминале. Если задачи отображения нет, то и tee не надо. И наконец идем в первый терминал pts/0. В нем ищем pid процесса echo.sh, пусть будет 31715, и запускаем команду:
$ echo "Hello world" > /proc/31715/fd/0
Проверяем результат в остальных терминалах. Во втором будет Hello world +, в третьем - Hello world + +

Комментариев нет:

Отправить комментарий