Проблемы при отправке ввода на отдельный экран через readreg и вставку - PullRequest
1 голос
/ 09 декабря 2010

Я пытаюсь отправить ввод в интерактивную команду, запущенную через экран.Вот моя начальная команда

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-процесс, поэтому интерактивная оболочка (bash) недоступна.Моя цель - запустить psql в интерактивном режиме, передать ему ввод и захватить его вывод через файл журнала.

До сих пор я пытался запустить экран через xterm (или konsole или gnome-терминал) в режиме подключения, используйте readreg / paste и затем отсоедините, но я понимаю, что xterm не будет доступен в моей производственной среде.Я также попытался отправить вывод в / proc // fd / 0, но я не могу эмулировать 'ENTER' с клавиатуры (мне нужно присоединить и нажать, чтобы вывод был принят psql).Я думаю, что pipe и fifo могут помочь, но я не могу понять, как с ними работать, используя screen и psql.

Я ценю любые дальнейшие подсказки или обходные пути.

Спасибо,

Усман.

Ответы [ 4 ]

2 голосов
/ 29 ноября 2012

Ну, вы можете использовать

screen -S psql -p 0 -X stuff $'\n'

или лучше (работает для меня)

screen -S mname -p 0 -X stuff `echo -ne '\015'`

-p 0 необходимо для выбора окна.

1 голос
/ 09 декабря 2010

Вы пробовали это, чтобы "нажать ввод" после ваших readreg и paste?

screen -S psql -X stuff $'\n'
1 голос
/ 09 декабря 2010

ЗАКЛЮЧИТЕЛЬНЫЙ ОТВЕТ: Это ошибка / особенность в 'экране GNU', для которой требуется команда DISPLAY по крайней мере один раз, чтобы команда 'paste' работала. Ниже приведены возможные варианты решения этой проблемы:

Наконец-то разобрался, как использовать 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 '.

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

Это позволяет psql работать в полном интерактивном режиме, в отличие от исходного решения, которое я использовал (в котором psql не работает в интерактивном режиме).

Спасибо.

Усман

0 голосов
/ 18 марта 2011

У меня была такая же проблема. Мой обходной путь состоял в том, чтобы запустить прикрепленный экран, но передать ему файл screenrc, где последняя команда "detach"

Так что это мой экран

#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

...