Suite de pipes en boucle - Shell/Batch - Programmation
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...
Marsh Posté le 29-04-2010 à 10:37:03
peut-être en lançant un "copocess"
Citation :
Start a coprocess with a 2-way pipe to it
Read from the pipe to the coprocess, instead of standard input
Write to the pipe connected to the coprocess, instead of standard output |
http://www.dartmouth.edu/~rc/class [...] esses.html
Marsh Posté le 29-04-2010 à 11:24:28
Faut que j'étudie ça
Il sort d'où cet opérateur |& ?
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 ??? |
Je m'en fiche de l'écran
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
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
(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 )
Marsh Posté le 28-04-2010 à 21:50:29
Bonjour
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
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
(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