Переопределение вывода на другой терминал в Linux

Преамбула

Пришли сегодня ко мне с одной задачкой, мол есть у нас программка, которая висит в фоне и периодически выводит данные в консоль. Неудобно оператору работать, либо что-то другое делать, либо ничего не делать, лишь в консоль смотреть. Даже отдельный комп думаем программке выделить, чтоб она на нем крутилась-вертелась. И нельзя ли так сделать, чтоб программку на другом терминале запустить, чтоб можно было по Ctrl+Alt+F[номер] переключаться, и за состоянием программки смотреть?

Вот запустить нельзя, без особого бубна, а вывод переопределить, всегда пожалуйста.

Решение

Можно пользуясь стандартным перенаправлением ввода-вывода в Linux, заставить программу или скрипт отправлять сообщения на другой терминал. Пусть программка будет называться tscript. За терминалы в Linux отвечают устройства /dev/tty*, например, /dev/tty2 отвечает за терминал, вызываемый по Ctrl+Alt+F2.
Например, чтобы программа переопределяла вывод на /dev/tty2, запускаем ее таким образом:

tscript >/dev/tty2

Можно отправить на другой терминал только вывод сообщений об ошибках:

tscript 2>/dev/tty2

Чтобы программа работала в фоне, а на том терминале, с которого мы ее запустили, можно было продолжить работу, добавляем после команды знак &:

./tscript >/dev/tty2 &

Пример

Пишем тестовый скрипт, который, скажем, будет бесконечно выводить на консоль случайное шестнадцатиричное число раз в секунду:

#!/bin/bash

SEC=1

echo "Test script, write to STDOUT random number after $SEC sec."

while [ 1 -eq 1 ];do
    sleep $SEC
    printf 'Number: %x\n' $RANDOM
done

Пишем скрипт, который будет убивать тестовый:

#!/bin/bash
echo "Kill test script..."
pkill tscript

Пишем запускающий скрипт, в котором вывод тестового скрипта переопределяется на терминал tty2:

#!/bin/bash
TERMNO=2
echo "Send tscript output to terminal #$TERMNO"
./tscript >/dev/tty$TERMNO &

Пример работы

Запускаем тестовый скрипт на текущем терминале:

Выполняем запускающий скрипт:


Состояние tty1


Вывод на tty2

Исходники примера

На GitHub

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*