<![CDATA[Forum Ubuntu-fr.org / Comment récupérer la valeur retournée par Mysql ouvert avec un coproc]]> http://forum.ubuntu-fr.org/viewtopic.php?id=1214321 Thu, 16 Nov 2017 14:30:16 +0000 FluxBB <![CDATA[Réponse à : Comment récupérer la valeur retournée par Mysql ouvert avec un coproc]]> http://forum.ubuntu-fr.org/viewtopic.php?pid=21826421#p21826421 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 !

]]>
Thu, 16 Nov 2017 14:30:16 +0000 http://forum.ubuntu-fr.org/viewtopic.php?pid=21826421#p21826421
<![CDATA[Réponse à : Comment récupérer la valeur retournée par Mysql ouvert avec un coproc]]> http://forum.ubuntu-fr.org/viewtopic.php?pid=12784181#p12784181 essayer si bash lit fd 3

mot_cle=$(<&3)
]]>
Mon, 04 Mar 2013 14:06:29 +0000 http://forum.ubuntu-fr.org/viewtopic.php?pid=12784181#p12784181
<![CDATA[Réponse à : Comment récupérer la valeur retournée par Mysql ouvert avec un coproc]]> http://forum.ubuntu-fr.org/viewtopic.php?pid=12783091#p12783091 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?

]]>
Mon, 04 Mar 2013 11:16:53 +0000 http://forum.ubuntu-fr.org/viewtopic.php?pid=12783091#p12783091
<![CDATA[Réponse à : Comment récupérer la valeur retournée par Mysql ouvert avec un coproc]]> http://forum.ubuntu-fr.org/viewtopic.php?pid=12774111#p12774111 quel subshell ?

$ coproc t (date)
[1] 1625
$ read -u ${t[0]} x ; echo $x
Sun Mar 3 16:06:54 CET 2013
$ 
]]>
Sun, 03 Mar 2013 15:08:30 +0000 http://forum.ubuntu-fr.org/viewtopic.php?pid=12774111#p12774111
<![CDATA[Réponse à : Comment récupérer la valeur retournée par Mysql ouvert avec un coproc]]> http://forum.ubuntu-fr.org/viewtopic.php?pid=12773591#p12773591 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$
==============================================

]]>
Sun, 03 Mar 2013 14:23:16 +0000 http://forum.ubuntu-fr.org/viewtopic.php?pid=12773591#p12773591
<![CDATA[Réponse à : Comment récupérer la valeur retournée par Mysql ouvert avec un coproc]]> http://forum.ubuntu-fr.org/viewtopic.php?pid=12772111#p12772111 hello
essayer pour le point 1

mot_cle=$(< /dev/fd/${MYSQL[0]})
]]>
Sun, 03 Mar 2013 11:51:00 +0000 http://forum.ubuntu-fr.org/viewtopic.php?pid=12772111#p12772111
<![CDATA[Comment récupérer la valeur retournée par Mysql ouvert avec un coproc]]> http://forum.ubuntu-fr.org/viewtopic.php?pid=12766611#p12766611 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.

]]>
Sat, 02 Mar 2013 20:28:04 +0000 http://forum.ubuntu-fr.org/viewtopic.php?pid=12766611#p12766611