Общаясь между экраном и скриптом

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

Моей первой идеей было использование именованного канала для связи между двумя процессами. Однако, использование реального именованного канала приводит к тому, что скрипт зависает навсегда - экран загружается и работает нормально, и я могу получить доступ к нему позже, но терминальный процесс просто зависает, не возвращаясь:

pipe=/tmp/fwdpipe$$
trap "rm -f $pipe" exit

mkfifo $pipe

server=$(cat $pipe) &

screen -dmS jupyter
screen -S jupyter -X stuff "cat foo" > $pipe\015"

wait
echo $server

(Шаблон фона и ожидания - это эксперимент; проблема сохраняется, если я сдвину строку server= в конец.)

Если я использую вместо этого обычный файл, то cat жалуется, что этого файла не существует. В любом случае, мне кажется, что я не могу достичь этой первоначальной цели, общаясь с экрана .

0
задан 21 September 2020 в 00:44

1 ответ

Вы должны запустить команду screen перед чтением из fifo. В этом примере текущий каталог будет указан на экране , а ошибка несуществующего пути будет перенаправлена ​​в fifo.

#!/bin/bash  
  
[[ -p screen.fifo ]] \  
|| mkfifo -m 660 screen.fifo  
  
exec 3<>screen.fifo

session=test  

screen -ls $session >&- || screen -dmS $session  
screen  -S $session \  
        -X stuff 'ls \$PWD nonexistent 2> screen.fifo\n' &  
  
while IFS= read -r -u 3; do  
echo REPLY: $REPLY  
done

Вы также можете использовать tee для записи как на экран, так и в fifo:

#!/bin/bash

[[ -p screen.fifo ]] \
    || mkfifo -m 660 screen.fifo

session=test

screen -ls $session >&- || screen -dmS $session
screen  -S $session \
        -X stuff "printf '%s\\\n%s\\\n' hello world | tee screen.fifo\n"

text="$(cat < screen.fifo)"
echo "$text"
0
ответ дан 21 September 2020 в 08:45

Другие вопросы по тегам:

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