Suite de pipes en boucle

Suite de pipes en boucle - Shell/Batch - Programmation

Marsh Posté le 28-04-2010 à 21:50:29    

Bonjour :jap:  
 
Je suis en train de faire un script et, comme tout bon unixien, j'utilise les pipes. Actuellement, mon script ressemble à ceci :

+------+    +-------+    +------+    +-------------+    +------+    +-------+
| echo | -> | MySQL | -> | awk1 | -> | traitements | -> | awk2 | -> | MySQL |
+------+    +-------+    +------+    +-------------+    +------+    +-------+


Le "echo" envoie un SELECT (à 2-3 paramètres près, la requête est "en dur" dans le script) pour récupérer les noms des objets à traiter
Le "awk1" décortique le résultat renvoyé par MySQL et construit les commandes correspondantes, traitées par le bloc suivant
Le "awk2" construit les requêtes (INSERT) à partir des résultats
 
C'est beau, ca marche, c'est parfait, la vie est belle, les filles se jettent sur moi et mon commercial me parle spontanément d'augmentation :love:  :whistle:  
 
Mais mon côté perfectionniste reste insatisfait : les 2 blocs MySQL sont finalement identiques (connexion à la même base avec le même user) et donc ca me semble idiot de se connecter 2 fois
A priori, ce serait simple : utiliser une seule connexion MySQL et "démarrer" l'ensemble en envoyant le SELECT par le bloc BEGIN du bloc "awk2", ce qui donnerait donc :

                                  +------+
   +------+    +-------------+    | echo |    +-------+
+> | awk1 | -> | traitements | -> | awk2 | -> | MySQL | ->-+
|  +------+    +-------------+    +------+    +-------+    |
^                                                          V
+------------------------------<---------------------------+


 
Faudra juste que je fasse quelques vérifications côté risques d'interblocage [:figti]  
(pas d'inquiétude pour la terminaison)
 
Ma question est la suivante : comment mettre en place la boucle ? Comment je redirige la sortie standard du dernier processus de mes pipes à l'entrée standard du 1er :??:  :??:  
 
Autrement, si vous savez juste comment lancer 2 processus ayant chacun l'entrée standard reliée à la sortie standard de l'autre, je devrais me débrouiller :)


Message édité par mrbebert le 28-04-2010 à 22:08:13
Reply

Marsh Posté le 28-04-2010 à 21:50:29   

Reply

Marsh Posté le 29-04-2010 à 08:51:42    

Super idée. Mais en faisant ainsi, même si ça marche ben tu n'auras jamais aucun résultat à l'écran vu que chaque stdout sera consommé par le stdin suivant. Par ailleurs ben t'as pensé à la façon de quitter la boucle ???
Désolé, ça on peut pas. L'enchainement des pipes sert à produire un traitement fini. D'ailleurs tu dis que tes blocs mysql sont les mêmes mais c'est pas vrai, l'un fait du select et l'autre de l'insert. Donc tu vas devoir en rester là.
 
Toutefois t'as un outil PostgreSQL qui est "INSERT SELECT" http://www.lokris.net/doc/mysql/insert-select.html. Tu peux essayer de voir s'il existe aussi sous MySQL et tenter de ce coté...
 
PS: le awk1 |traitement|awk2 pourrait peut-être se simplifier en un unique awk...

Message cité 1 fois
Message édité par Sve@r le 29-04-2010 à 08:52:47

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 29-04-2010 à 10:37:03    

peut-être en lançant un "copocess" :??:

 
Citation :

  • command |&

Start a coprocess with a 2-way pipe to it

 
  • read -p var

Read from the pipe to the coprocess, instead of standard input

 
  • print -p args

Write to the pipe connected to the coprocess, instead of standard output

 

http://www.dartmouth.edu/~rc/class [...] esses.html


Message édité par art_dupond le 29-04-2010 à 10:37:50

---------------
oui oui
Reply

Marsh Posté le 29-04-2010 à 11:24:28    

Faut que j'étudie ça [:figti]  
Il sort d'où cet opérateur |& ? :pt1cable:

Sve@r a écrit :

Super idée. Mais en faisant ainsi, même si ça marche ben tu n'auras jamais aucun résultat à l'écran vu que chaque stdout sera consommé par le stdin suivant. Par ailleurs ben t'as pensé à la façon de quitter la boucle ???
Désolé, ça on peut pas. L'enchainement des pipes sert à produire un traitement fini. D'ailleurs tu dis que tes blocs mysql sont les mêmes mais c'est pas vrai, l'un fait du select et l'autre de l'insert. Donc tu vas devoir en rester là.
 
Toutefois t'as un outil PostgreSQL qui est "INSERT SELECT" http://www.lokris.net/doc/mysql/insert-select.html. Tu peux essayer de voir s'il existe aussi sous MySQL et tenter de ce coté...
 
PS: le awk1 |traitement|awk2 pourrait peut-être se simplifier en un unique awk...

Je m'en fiche de l'écran :D  
Le but c'est d'avoir un script qui va lire les objets à traiter dans une table et écrit les résultats correspondants dans une autre table. Je ne veux rien à l'écran. De toute façon, c'est un script destiné à être exécuté en batch, pas en mode interactif [:proy]  
 
Pour la terminaison, j'aurais plusieurs solutions possibles. Par exemple, terminer le "awk1" quand il a fini de lire les résultats de la requête de lecture [:figti]  
(dans le pire des cas, la partie "traitements" va se déconnecter toute seule en cas d'inactivité prolongée)
 
(et SELECT et INSERT, ca passe très bien à la suite dans une même connexion MySQL :) )

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed