Я хотел бы написать сценарий, который запускает процесс на экране 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
жалуется, что этого файла не существует. В любом случае, мне кажется, что я не могу достичь этой первоначальной цели, общаясь с экрана .
Вы должны запустить команду 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"