我正在尝试将输入发送到通过屏幕运行的交互式命令。这是我的初始命令
screen -L -c ./customrc -S psql -d -m /opt/PostgreSQL/9.0/bin/psql
上面的命令将在屏幕分离模式下运行交互式psql。 customrc用于定义输出的日志文件(我将通过轮询从另一个进程读取)
我使用以下两个命令将输入发送到在屏幕上运行的psql
screen -S psql -X readreg p psqlcommands.sql
screen -S psql -X paste p
问题是除非我至少重新连接一次屏幕,否则上述命令不起作用。连接屏幕并分离后,上述命令按预期工作。我必须通过后台java进程启动这些命令,因此交互式shell(bash)不可用。我的目标是以交互模式运行psql并将输入传递给它并通过日志文件捕获其输出。
到目前为止,我已尝试在附加模式下通过xterm(或konsole或gnome-terminal)运行屏幕,使用readreg / paste然后分离,但我意识到xterm将无法在我的生产环境中使用。我也尝试将输出发送到/ proc // fd / 0但我无法从键盘模拟'ENTER'(我必须附加并按下以便输出被psql接受)。我认为管道和fifo可能会有所帮助,但我无法弄清楚如何使用screen和psql继续它们。
我感谢任何进一步的提示或解决方法。
谢谢,
奥斯曼。
答案 0 :(得分:2)
好吧,你可以用
screen -S psql -p 0 -X stuff $'\n'
或更好(适合我)
screen -S mname -p 0 -X stuff `echo -ne '\015'`
选择窗口需要 -p 0
。
答案 1 :(得分:1)
最终答案:“GNU屏幕”中的一个错误/功能是至少需要一次DISPLAY才能使“粘贴”命令生效。以下是可能的解决方法:
最后想出了如何在管道和屏幕上使用psql。这是解决方案:
mkfifo psql.pipe
screen -L -c ./customrc -S psql -d -m bash -i -c "while (true); do cat psql.pipe; done | /opt/PostgreSQL/9.0/bin/psql -a"
之后,我可以将命令发送到管道:
cat ./mycommands.sql > psql.pipe
要退出屏幕并终止psql,我使用了
screen -S psql -X quit
empty -f -i psql.in -o psql.o -p psql.pid <psqlpath>
这允许psql以完全交互模式运行,而不是我使用的原始解决方案(其中psql不以交互模式运行)。
感谢。
乌斯曼
答案 2 :(得分:1)
您是否尝试过readreg
和paste
之后“按Enter键”?
screen -S psql -X stuff $'\n'
答案 3 :(得分:0)
我有同样的问题。我的解决方法是启动附加屏幕但传递一个screenrc文件,其中最后一个命令是“detach”
所以这是我的screenrc
#change the hardstatus settings to give an window list at the bottom of the
#Set this first otherwise messes with bash profile
hardstatus alwayslastline
#screen, with the time and date and with the current window highlighted
#hardstatus string '%{= kG}%-Lw%{= kW}%50> %n%f* %t%{= kG}%+Lw%< %{= kG}%-=%c:%s%{-}'
hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %m-%d %{W}%c %{g}]'
#set scrollback
defscrollback 4096
#detach
detach
希望这有帮助
P