Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1003 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Suite de pipes en boucle

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Suite de pipes en boucle

n°1988539
mrbebert
Posté le 28-04-2010 à 21:50:29  profilanswer
 

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
mood
Publicité
Posté le 28-04-2010 à 21:50:29  profilanswer
 

n°1988587
Sve@r
Posté le 29-04-2010 à 08:51:42  profilanswer
 

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.
n°1988631
art_dupond
je suis neuneu... oui oui !!
Posté le 29-04-2010 à 10:37:03  profilanswer
 

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
n°1988649
mrbebert
Posté le 29-04-2010 à 11:24:28  profilanswer
 

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 :) )


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Suite de pipes en boucle

 

Sujets relatifs
[VBS] passé d'une macro à ...autoitBoucle dans un If
[SHELL/UNIX] boucleComptage des voyelles d'une suite de caracteres, plusieurs questions..
problème dans une boucle (masquer les lignes vides)(Résolu) Elements invisibles dans le html suite à un include
Substitution dans une boucle forAction executé periodiquement dans une boucle
Condition non null pour rentrer dasn ma boucle 
Plus de sujets relatifs à : Suite de pipes en boucle


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR