通过readreg和paste将输入发送到分离的“屏幕”时出现问题

时间:2010-12-08 21:31:31

标签: bash gnu-screen postgresql

我正在尝试将输入发送到通过屏幕运行的交互式命令。这是我的初始命令

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继续它们。

我感谢任何进一步的提示或解决方法。

谢谢,

奥斯曼。

4 个答案:

答案 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

编辑:(最后)在没有使用screen命令的情况下找出问题的解决方案。满足'empty'效用。

empty -f -i psql.in -o psql.o -p psql.pid <psqlpath>

这允许psql以完全交互模式运行,而不是我使用的原始解决方案(其中psql不以交互模式运行)。

感谢。

乌斯曼

答案 2 :(得分:1)

您是否尝试过readregpaste之后“按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