Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/03/2013, à 21:28

mtr

Comment récupérer la valeur retournée par Mysql ouvert avec un coproc

Bonsoir,
Je voudrais utiliser dans un script bash shell un 'coproc' pour garder une connection ouverte et permanante de Mysql pour une histoire de performance. J'utilise le GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu).

Ci-dessous un exemple:

rk$ cat dada26
#!/bin/bash

mot_cle='debut'
echo mot_cle: "$mot_cle"
echo

{ coproc MYSQL { mysql -B --user=user --password=pssd --host=localhost test --silent --skip-column-names ;} 2>&1 >&3 ;}  3>&1

mot_cle=$( echo 'SELECT "salut le monde"' >&${MYSQL[1]} ;sleep 0.005;);

echo mot_cle: $mot_cle
echo

exit 0

rk$ bash dada26
mot_cle: debut

mot_cle:

salut le monde
rk$

J'ai utilisé un descripteur de fichier (file descriptor, FD), dans mon exemple FD3 (>&3), pour récupérer la sortie du coproc d'une requête sql donnée et de la rediriger ensuite vers la sortie standard FD1 (3>&1), c-a-d la console du shell courant.

J'ai du rajouter le 'sleep 0.005' afin de pouvoir capturer le résultat de la requête sql sur la console sinon, le shell courant n'attend pas le retour du coproc. Voir le résultat ci-dessous. J'ai utilisé aussi le 'wait $MYSQL_PID' mais ça n'a pas fonctionné.

mot_cle=$( echo 'SELECT "salut le monde"' >&${MYSQL[1]};);

rk$ bash dada26
mot_cle: debut

mot_cle:

rk$
salut le monde

J'ai deux questions:
1- comment récupérer la valeur retournée par Mysql ouvert avec un coproc dans une variable bash? mot_cle dans notre exemple.
2- comment éviter d'utiliser le 'sleep' qui est pour moi une solution inélégante car il est possible que des requêtes sql peuvent durer beaucoup plus longtemps que ce que nous mettons comme durée et cela veut dire que le shell courant n'attendra plus après la durée d'attente qu'on lui a imposé? et il est possible aussi que des requêtes peuvent être beaucoup plus rapide que la durée d'attente définie avec 'sleep' donc ce n'est pas non plus bénéfique pour la performance demandée?

Merci d'avance.

Dernière modification par mtr (Le 02/03/2013, à 21:39)

Hors ligne

#2 Le 03/03/2013, à 12:51

credenhill

Re : Comment récupérer la valeur retournée par Mysql ouvert avec un coproc

hello
essayer pour le point 1

mot_cle=$(< /dev/fd/${MYSQL[0]})

Hors ligne

#3 Le 03/03/2013, à 15:23

mtr

Re : Comment récupérer la valeur retournée par Mysql ouvert avec un coproc

Merci pour le retour.

En fait, le script reste en attente avec ça. voir ci dessous:
============================================
echo 'SELECT "salut le monde"' >&${MYSQL[1]} ;
mot_cle=$(< /dev/fd/${MYSQL[0]})

rk$ bash dada26
mot_cle: debut

^CCtrl-C -- exit!
============================================

J'ai essayé  une autre solution  avec 'read' en lisant la sortie du FD ${MYSQL[0]} mais la valeur retournée avec la variable 'line' dans la commande 'read' est ignorée par le shell courant à cause du problème de subshell.
==============================================
...
echo 'SELECT "salut le monde"' >&${MYSQL[1]} ;
read -r -t 0.05 -u ${MYSQL[0]} line;

echo mot_cle: "$line"
echo
...
==============================================
rk$ bash dada26
mot_cle: debut

mot_cle:

salut le monde
rk$
==============================================

Hors ligne

#4 Le 03/03/2013, à 16:08

credenhill

Re : Comment récupérer la valeur retournée par Mysql ouvert avec un coproc

quel subshell ?

$ coproc t (date)
[1] 1625
$ read -u ${t[0]} x ; echo $x
Sun Mar 3 16:06:54 CET 2013
$ 

Hors ligne

#5 Le 04/03/2013, à 12:16

mtr

Re : Comment récupérer la valeur retournée par Mysql ouvert avec un coproc

Effectivement, votre exemple marche bien. Le co-process s'arrête lorqu'il finit d'écrire sur son output standard le resultat de la commande qui lui est associée. Le FD COPROC[0] qui est connecté à l'output lit à son tour ce dernier. Et enfin, le FD est prêt pour être lu.

Par contre dans mon exemple, (corrigez-moi si je me trompes), comme la commande associée au co-process est une connection permanente sur Mysql, après une requête sql (par exemple: echo 'SELECT "salut le monde"' >&${MYSQL[1]} wink, le co-process reste toujours en arrière plan, après avoir écrit son output sur le FD MYSQL[0]. Et ce dernier reste toujours connecté sur l'output et en attente car il croit qu'il y a d'autres choses à lire sur l'ouput qui n'est pas encore fermé. Par conséquent, le 'read' du shell courant attend aussi que le FD lui autorise de lire son contenu. Ce qui met en attente aussi le shell courant.

C'est pourquoi, j'ai contournée le problème d'attente en utilisant un FD3 (>&3), pour récupérer la sortie du coproc pour une requète sql donnée et de la redirigér ensuite vers la sortie standard FD1 (3>&1), c-a-d la console du shell courant. Mais comment récuperer après la valeur retournée sur la console dans une variable bash?

Hors ligne

#6 Le 04/03/2013, à 15:06

credenhill

Re : Comment récupérer la valeur retournée par Mysql ouvert avec un coproc

essayer si bash lit fd 3

mot_cle=$(<&3)

Hors ligne

#7 Le 16/11/2017, à 15:30

paradoxal

Re : Comment récupérer la valeur retournée par Mysql ouvert avec un coproc

Bonjour,
Je reviens sur la question posée avec beaucoup de retard, mais je me suis trouvé confronté au même problème et j'ai fini par trouver une solution. Alors peut-être que cela pourra servir à quelqu'un d'autre. D'autant que la réponse est assez frustrante et surtout beaucoup moins technique que ce que la question a soulevé :

Il faut remplacer  echo 'SELECT "salut le monde"' par  echo 'SELECT "salut le monde";'

Hallucinant n'est ce pas !!!!
En essayant de regarder pourquoi le script indiqué dans la question ne fonctionnait pas, j'ai laissé le script se terminer après 5 secondes et la réponse était : "Terminal close -- query aborted"
Alors que je pensais ne pas avoir laissé de requête en cours....

Frustrant non ?

paradoxalement votre !


SDLCAA

Hors ligne