我想编写一个脚本,启动一个进程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
.
答案1
您应该screen
在读取之前启动命令fifo
。此示例将列出中的当前目录,screen
并且不存在的路径错误将重定向到 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
以下方法写入screen
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"