IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes POSIX Discussion :

Comment faire dialoguer entre eux deux scripts ?


Sujet :

Shell et commandes POSIX

  1. #1
    Membre habitué
    Homme Profil pro
    ingénieur calcul
    Inscrit en
    Décembre 2007
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 363
    Points : 180
    Points
    180
    Par défaut Comment faire dialoguer entre eux deux scripts ?
    Bonjour,
    je fais du calcul de structures; il existe dans ma boite une procédure de lancement pour les grosses analyses qui durent plusieurs heures, cependant, pour de tout petits runs de vérification préalable, répondre aux diverses questions que pose ce script me prend plus de temps que le calcul lui mÁme; donc je veux automatiser mes réponses par un autre script, qui analyserait pour moi les questions du premier, et répondait selon mes propres besoins et avec la logique que je lui aurait donne.

    Par exemple, la première procédure se lance par $ /usr/expl/bin/qnastran.3.3 et elle pose une dizaine de questions qui commencent par :

    Les versions nastran disponibles sont :
    nast20055
    nast2008
    Entrez la version de nastran désirée :
    Et il me suffit de répondre nast20055 (+RTN).

    Il y a par la suite une petite dizaine de questions, avec parfois des valeurs par défaut ou il suffit de faire RTN.

    Je voudrais donc faire un script qui réponde aux questions de ce premier script selon mes besoins, mais un "pipe" ne suffit pas; il me faut en effet non seulement que (l’entrée standard de) mon script "lise" (ou soit reliÅe È) la sortie standard de la procédure de lancement des jobs, mais il faut aussi que cette procédure soit alimentée par les réponses que fabriquerait mon script.

    J'ai essayÅ de commencer ceci avec un "pipe", mais µa ne va pas; quand je fais :
    $ /usr/expl/bin/qnastran.3.3|Snas.sh avec Snas.sh comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    while read LINE
      do
        echo $LINE
        if [ $(echo $LINE|grep "Entrez la version de nastran desiree"|wc -l) -gt 0 ]; then
          echo nast20055
        fi
        if [ $(echo $LINE|grep "Entrez les serveurs de licence que vous souhaitez utiliser"|wc -l) -gt 0 ]; then
          echo ca-msclic.geci.net+su-msclic.geci.net+msclic.geci.net+ishp170.geci.net
        fi
        echo
      done
    alors mon script ci dessus répond bien à la première question et affiche la réponse à l’écran, mais celle ci n'est pas prise en compte par le script qnastran.3.3 qui devrait lancer le job, puisque son entrée standard à lui est vide. (Il faudrait que la sortie standard du deuxième script soit recopiée sur l’entrée standard du premier script; ce serait une espèce de "pipe" à l'envers mais je ne sais pas comment faire.

    J’espère que vous pourrez me donner des pistes de recherche ou des solutions;
    merci,
    David

  2. #2
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 311
    Points : 12 830
    Points
    12 830
    Par défaut
    Bonjour,

    Fait une recherche sur les pipe nommés (FIFO). Si ton OS (pas précisé) le permet, tu crée 2 FIFO: 1 pour l'entrée, une pour la sortie, tu lance le script qui pose les questions en redirigeant les entrées sortie sur tes FIFO et ensuite, ton script n'a plus qu'a aller lire la FIFO de sortie, l'analyser, et ecrire dans la fifo d'entrée la réponse.
    Selon comment est ecrit le script qui pose les question, cela peut fonctionner.

    Sinon, il existe des utilitaire comme "expect" qui permet de faire des automates.

  3. #3
    Membre habitué
    Homme Profil pro
    ingénieur calcul
    Inscrit en
    Décembre 2007
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 363
    Points : 180
    Points
    180
    Par défaut
    Bonjour disedorgue,
    l'OS de la machine sur laquelle je bosse est un vieil HPUX sur des HP 9000 qui ont dans les dix ans, mais en fait la machine qui passe les calculs est un bon linux assez récent.
    Alors j'ai essayé à peu près ce que tu me dis, mais l'un des scripts est root (le script de lancement original) donc il faut que je me débrouille sans toucher à rien d'autre qu'aux E/S de celui-là.
    Je vais faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mkfifo /tmp/questions
    mkfifo /tmp/réponses
     
    qnastran < /tmp/réponses > /tmp/questions
    (ceci est le script de lancement "officiel" des jobs, qui est root)

    et dans une autre fenêtre : (ou après un "&" sur la première commande)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mon_script < /tmp/questions > /tmp/réponses
    Et si tout se passe bien ça devrait gazer; je risque de ne pas avoir le temps de faire tellement d'essais demain, mais dès que je peux, et si j'ai besoin d'aide, je viendrais ici.
    Merci encore,
    David

  4. #4
    Membre habitué
    Homme Profil pro
    ingénieur calcul
    Inscrit en
    Décembre 2007
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 363
    Points : 180
    Points
    180
    Par défaut
    Bonjour,
    je suis encore en train d'envisager comment faire dialoguer mes deux scripts.
    J'ai soumis le problème sur deux forums, où l'on m'a donné des réponses, ou des débuts de réponses, assez semblables heureusement :
    http://forum.ubuntu-fr.org/viewtopic.php?id=1280931 et http://www.developpez.net/forums/d13...-deux-scripts/

    Alors voici où j'en suis; le script qui s'appelle "qnastran" est "root", et il s'utilise normalement de façon interactive (question/réponse), et c'est justement ce que je veux contourner; donc j'envisage de faire un script comme suit, sans avoir à modifier l'autre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #--------------------------------début
    mkfifo /tmp/question
    mkfifo /tmp/réponse
    #
    qnastran < /tmp/réponse > /tmp/question &
    while true
    do
      sleep 1
      read question < /tmp/question
      case "$question" in
       "question 1") echo "réponse à la question 1" >/tmp/reponse;;
       "question 2") echo "réponse à la question 2" >/tmp/reponse;;
       "question 3") echo "réponse à la question 3" >/tmp/reponse;;
       "Fin")        echo >/tmp/reponse; break;;
       esac
      sleep 1
    done
    #
    rm /tmp/question
    rm /tmp/reponse
    #--------------------------------fin

    Héhop; cela vous semble-t'il correct ? Moi ça me plaît et j'essaierai mardi; dites moi SVP si vous y voyez déjà un empêchement.
    Merci,
    David

  5. #5
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 311
    Points : 12 830
    Points
    12 830
    Par défaut
    Voici un exemple fonctionnel utilsant à la fois le pipe nommé et le pipe anonyme "|".
    On crée le fifo:
    Voici par exemple le script "root" qui pose les questions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $ cat snm.sh
    #!/bin/bash
     
    while true
    do
            echo "Valeur:"
            read f
            if [ "${f}" -eq "12" ]
            then
                    echo "Bingo"
                    sleep 2
                    exit
            fi
    done
    Le script qui répond au questions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    $ cat srsp.sh
    #!/bin/bash
     
    for i in {1..15}
    do
            read f
            if [ "$f" = "Valeur:" ]
            then
                    echo "$f $i" >&2
                    echo $i
            fi
            if [ "$f" = "Bingo" ]
            then
                    echo "$f" >&2
                    exit
            fi
    done
    Les echo redirigé sur la sortie erreur ( >&2 ) ne sont là que pour l'exemple, sinon, on ne verrait rien.
    Et comment les appeler en utilisant le fifo précédemment créé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $ ./snm.sh <echange | ./srsp.sh >echange
    Valeur: 1
    Valeur: 2
    Valeur: 3
    Valeur: 4
    Valeur: 5
    Valeur: 6
    Valeur: 7
    Valeur: 8
    Valeur: 9
    Valeur: 10
    Valeur: 11
    Valeur: 12
    Bingo

Discussions similaires

  1. VB6 Comment Faire : "Dialogue entre 2 machines"
    Par C_Mila dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 16/03/2007, 15h59
  2. Réponses: 3
    Dernier message: 04/03/2007, 20h00
  3. Comment faire une classe avec deux form?
    Par Mickey.jet dans le forum Delphi
    Réponses: 10
    Dernier message: 04/07/2006, 19h23
  4. [XSLT] [HTML] Comment ils interragissent entre eux ?
    Par _Froggy_ dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 25/11/2005, 23h59
  5. Réponses: 10
    Dernier message: 30/06/2005, 13h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo