2010-12-08 46 views
1

J'essaie d'envoyer une entrée à une commande interactive exécutée via l'écran. Voici ma commande initialeProblèmes lors de l'envoi d'une entrée à un 'écran' détaché via readreg et coller

screen -L -c ./customrc -S psql -d -m /opt/PostgreSQL/9.0/bin/psql 

La commande ci-dessus se déroulera psql interactive en mode écran Détacher. Le customrc est utilisé pour définir un fichier journal pour la sortie (que je vais lire un autre processus par vote)

J'utilise après deux commandes pour envoyer des données à psql en cours d'exécution à l'écran

screen -S psql -X readreg p psqlcommands.sql 
screen -S psql -X paste p 

Le problème est que les commandes ci-dessus ne fonctionnent pas, sauf si je rattache l'écran au moins une fois. Une fois que j'ai joint l'écran et détaché, les commandes ci-dessus fonctionnent comme prévu. Je dois lancer ces commandes via le processus java en arrière-plan, donc le shell interactif (bash) n'est pas disponible. Mon but est d'exécuter psql en mode interactif et de lui transmettre une entrée et de capturer sa sortie via un fichier journal. Jusqu'à présent, j'ai essayé d'exécuter l'écran via xterm (ou konsole ou gnome-terminal) en mode attach, utilisez readreg/paste, puis détachez, mais je me rends compte que xterm ne sera pas disponible dans mon environnement de production. J'ai aussi essayé d'envoyer la sortie vers/proc // fd/0 mais je suis incapable d'émuler 'ENTER' depuis le clavier (je dois attacher et appuyer pour que la sortie soit acceptée par psql). Je pense que les tuyaux et fifo peuvent aider mais je suis incapable de comprendre comment procéder avec eux en utilisant screen et psql.

J'apprécie d'autres conseils ou solutions de contournement.

Merci,

Usman.

Répondre

1

RÉPONSE FINALE: C'est un bug/une caractéristique dans 'l'écran GNU' qui a besoin d'un DISPLAY au moins une fois pour que la commande 'paste' fonctionne. Voici les solutions de contournement possibles de ce problème:

Enfin compris comment utiliser psql avec des tuyaux et écran. Voici la solution:

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" 

Après cela, je peux chat mes commandes à la conduite:

cat ./mycommands.sql > psql.pipe 

Pour quitter de l'écran et se terminant psql, je

screen -S psql -X quit 

EDIT: (enfin) compris la solution pour mon problème sans utiliser la commande d'écran. Rencontrez l'utilitaire 'empty'.

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

Cela permet psql de fonctionner en mode plein interactif, par opposition à la solution originale que je (dans lequel psql ne fonctionne pas en mode interactif).

Merci.

Usman

+0

Vous n'avez pas besoin d'exécuter 'true' dans un sous-shell,' true' fonctionnera correctement. –

+0

Cela me donne une erreur de syntaxe si je ne l'exécute pas via un sous-shell. –

1

Avez-vous essayé cela "appuyez sur Entrée" après votre readreg et paste?

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

Oui je l'ai fait, ça ne marchera pas (parce que j'ai d'abord lancé l'écran en mode détaché, c'est-à-dire -d -m). La même chose arrive avec la commande 'process reg'. Si je rattache l'écran au moins une fois, alors toutes ces commandes fonctionnent. Il me semble que d'une manière ou d'une autre le tampon de l'écran n'est pas initialisé à moins que son assignation à l'affichage actuel ne soit en quelque sorte. –

0

J'ai rencontré le même problème. Ma solution était de lancer l'écran ci-joint, mais passer un fichier screenrc où la dernière commande est "détachez"

Alors ceci est mon 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 

Hope this helps

P

+0

Donc, je lance l'écran comme suit "screen -c screenrc_detaching" – PiersyP

2

bien , vous pouvez utiliser

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

ou mieux (fonctionne pour moi)

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

-p 0 est nécessaire pour sélectionner la fenêtre.