Распечатать вывод на терминал - PullRequest
0 голосов
/ 29 октября 2019

Кто-нибудь знает, возможно ли напечатать две echo команды скрипта на одном терминале? Проблема в том, что скрипт, который должен печатать на терминал, автоматически выполняется systemd service.

. Я уже обнаружил, что возможно открыть терминал и позволить ему выполнять некоторые команды, подобные этой:

konsole -e <strong>command</strong>

Однако это откроет новый терминал для каждой команды, и я хочу, чтобы все они выполнялись на одном и том же терминале.

С уважением, Pepsilon

Ответы [ 3 ]

0 голосов
/ 29 октября 2019

Отбросив вопрос о том, как обращаться с ситуациями, когда не существует сеанса терминала / X, который можно использовать для захвата журнала. К ним можно обратиться, проверив доступность X / терминала и вернувшись к файлу журнала.

Каждый терминал подключен к уникальному псевдотерминалу (PTY), обычно / dev / pts / 0, / dev / pts/ 1, ...,. Все, что будет отправлено в PTY, будет отображаться на терминале (konsole, gnome-терминал, xterm, ...).

Вы можете создать решение, используя следующее

  • Launchтерминал с командой:
    • konsole -e '(tty ; echo $$) > /tmp/active_tty ; while true ; do sleep 600 ; date ; done' &.
    • Эффективно заставить терминал оставаться в рабочем состоянии до тех пор, пока он не будет закрыт / убит.
    • Файл будет захватывать tty name и PID
    • может использовать gnome-терминал, xterm, ...
  • Каждый процесс, который хочет отправить вывод на «текущий» лог-терминал, должен перенаправить stdout и / или stderr наимя, указанное в файле:
    • exec > $(head -1 /tmp/active_tty) 2>&1 или аналогичное

Линия PID может использоваться для проверки того, работает ли PID терминала, еслинеобходимо.

0 голосов
/ 29 октября 2019

Я предлагаю использовать именованный канал, созданный с mktemp в пространстве для временных файлов. Обратите внимание, что mktemp -u немного небезопасно.

Я помогал себе с Как избежать эхо-закрытия FIFO-именованных каналов? - Забавное поведение Unix FIFOs с этим tail -f:

our_named_pipe=$(mktemp -u) &&
mkfifo $our_named_pipe && {
    tail -f > $our_named_pipe & # is holding pipe open
    named_pipe_holder_pid=$!
    echo $our_named_pipe # outputting in case you would want to unsafely use it outside 
    mate-terminal -e \
    "bash -c \"cat $our_named_pipe; echo 'Finished, press enter to exit'; read\"" && {
        echo "Do things, everythings fine" > $our_named_pipe
        sleep 10 > $our_named_pipe
    } || echo "You got an error from the terminal emulator"
    kill -9 $named_pipe_holder_pid
} || echo "you got an error from mkfifo"
0 голосов
/ 29 октября 2019

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

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

Но вы можете перенаправить эхо-сигналы на консоль (/ dev / console), которая предназначена для того, чтобы быть единственным терминалом, «всегда присутствующим». В противном случае вы можете перенаправить на любой терминал, который, как вам известно, существует - я имею в виду такие вещи, как / dev / ttyS0 или аналогичные, если вы знаете, что делаете (и ваш сценарий имеет разрешение на это). В графической среде может быть что угодно, например, в моей системе имеется около 4 текстовых терминалов, которые можно просмотреть, нажав Ctrl-Alt-F1 / 2/3 и т. Д.

...