Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 16/05/2013, à 13:09

dva2tlse

Comment faire dialoguer 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Åpondrait selon mes propres besoins et avec la logique que je lui aurait donnÅe.

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 oË 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 standart 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 :

  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 standart du deuxiÉme script soit recopiÅe sur l'entrÅe standart 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


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#2 Le 16/05/2013, à 13:21

pingouinux

Re : Comment faire dialoguer deux scripts ?

Bonjour,
Si tu connais d'avance les réponses que tu vas donner, dans le bon ordre, tu peux faire ceci :

/usr/expl/bin/qnastran.3.3 <fichier_qui_contient_les_réponses

Hors ligne

#3 Le 16/05/2013, à 13:25

Altak

Re : Comment faire dialoguer deux scripts ?

As-tu pensé a faire un petit programme en C qui pourrait faire office de bridge entre tes 2 scripts?
L'idée qui vient serais d'utiliser des redirection (">") pour envoyer la sortie de l'un vers l'entré de l'autre.
le programme pourrait lire sur la sortie standart de tes 2 scripts et rediriger via une commande shel "echo blabla > script".
Ca fait longtemp que j'ai pas fait de C n'y de script shell avancé (redir et pipe remonte a déjà loin yikes ) alors je sais pas si ca peut marcher, j'ai pas testé mais ca me parait être une bonne idée ^^
Ca pourrait m'6etre utile si quelqu'un trouve une facon de faire fonctionnel.

Edit: A ce que j'ai compris, il a les premiere reponse dans une liste donc je pense pas qu'il les connaisse mais du coup, je vois que mon idée est pas si bête ^^

Dernière modification par Altak (Le 16/05/2013, à 13:28)

Hors ligne

#4 Le 16/05/2013, à 13:59

dva2tlse

Re : Comment faire dialoguer deux scripts ?

Merci à tous les deux de m'avoir déjà répondu.
@pingouinux: j'avais en effet essayé ceci puisque je n'ai que quelques jeux de réponses à donner, pas plus de cinq, donc j'aurais simplemement eu cinq commandes différentes pour lancer cinq types de jobs différents, mais d'autres paramètres qui me sont extérieurs changent un peu l'intitulé ou l'ordre des questions, donc je ne peux pas tout prévoir à l'avance et faire comme tu proposes.
@Altak: j'avais pensé à des redirections, mais d'un seul côté et ça ne suffit pas. Maintenant tu me donnes un petit prétexte pour refaire du C (je ne fais que des petites moulinettes séquentielles en fortran) alors voyons-voir ça... ça donnerait peut-être :
$ script-poseur_de_questions > passerelle_en_C > mon_script_qui_répond

Mais le problème va être que les réponses qu'élabore mon deuxième script devraient être fournies au premier script.
Alors je ne vois pas comment faire.
Merci en tous cas,
David


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#5 Le 16/05/2013, à 14:13

pingouinux

Re : Comment faire dialoguer deux scripts ?

Voici une suggestion en utilisant mkfifo. Le script x pose 3 questions, et attend les réponses fournies par le script y. Tu lances ./x et ./y dans 2 terminaux différents, dans cet ordre.

$ cat ./x
mkfifo /tmp/question

question="question 1"
echo "$question" >/tmp/question
sleep 1
read reponse </tmp/reponse
echo reponse à "$question" : "$reponse"

question="question 2"
echo "$question" >/tmp/question
sleep 1
read reponse </tmp/reponse
echo reponse à "$question" : "$reponse"

question="question 3"
echo "$question" >/tmp/question
sleep 1
read reponse </tmp/reponse
echo reponse à "$question" : "$reponse"

echo Fin >/tmp/question
sleep 1

rm /tmp/question
$ cat ./y
mkfifo /tmp/reponse

while true
do
   read 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")        break;;
   esac
done </tmp/question

rm /tmp/reponse

Voici le résultat dans le terminal d'où x a été lancé :

$ ./x
reponse à question 1 : réponse à la question 1
reponse à question 2 : réponse à la question 2
reponse à question 3 : réponse à la question 3

Hors ligne

#6 Le 16/05/2013, à 14:13

Altak

Re : Comment faire dialoguer deux scripts ?

En reflechissant un peu plus, pourquoi tu ne ferais pas un programme C qui lance tes 2 scripts (dans 2 process fils par exemple).
Avec 2 pipes ,qui relis l'entrée de l'un sur la sortie de l'autre, tu les fait dialoguer.
Il me semble que j'avais du faire ca en premiere année mais ca remonte maintenant a loin... Je me souviens plus du tout de la syntaxe mais c'est réalisable.

Hors ligne

#7 Le 16/05/2013, à 14:29

dva2tlse

Re : Comment faire dialoguer deux scripts ?

Merci encore les gars; ça me parait faisable vos propositions, donc ça fait deux pistes pour cet aprèm', merci. Ce que me propose pingouinux (anciennement pingouinlinux ?) va me demander un peu de mise en place mais ça me paraît faisable, et le C d'Alrak avec deux pipes, normalement j'ai déjà fait des trucs qui, judicieusement refragmentés et réutilsés et réassemblés devraient permettre que ça marche aussi, mais ça me parait plus lointain. (au passage, ici au boulot, le compilo du C n'est même pas un K&R, donc pas ISO et ça change du gcc que j'ai chez moi avec linux)


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#8 Le 16/05/2013, à 14:39

credenhill

Re : Comment faire dialoguer deux scripts ?

Hors ligne

#9 Le 16/05/2013, à 14:47

tiramiseb

Re : Comment faire dialoguer deux scripts ?

+1 credenhill, j'allais dire la même chose, ça c'est un boulot pour expect !

Hors ligne

#10 Le 16/05/2013, à 17:48

dva2tlse

Re : Comment faire dialoguer deux scripts ?

pour pingouinux: j'ai essayé ce que tu m'as envoyé, mais le script qui pose les questions est root, donc je vais être obligé d'imbriquer encore un niveau intermédiaire pour faire ce que je veux, mais ça me paraît faisable.

pour credenhill et tiramiseb qui l'a plussé :
en effet, maintenant que je suis rentré chez ma maison, j'ai pu aller voir sur le net ce qu'est expect, et ça a l'air de savoir faire exactement ce que je veux, sauf qu'il y a des choses à installer avec des droits de root que je n'ai pas, et il est totalement illusoire de croire que l'on va me laisser contourner de cette façon les procédures maison qui ont été pondues en haut lieu. (sans se soucier beaucoup des besoins des utilisateurs finaux, mais c'est décidé comme ça)
David


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#11 Le 16/05/2013, à 17:51

tiramiseb

Re : Comment faire dialoguer deux scripts ?

Il y a probablement moyen d'installer expect (et peut-être ses dépendances) sans avoir les droits root, dans ton répertoire utilisateur...

Hors ligne

#12 Le 16/05/2013, à 18:07

pingouinux

Re : Comment faire dialoguer deux scripts ?

En gardant le même principe, j'ai un peu amélioré mes scripts.

$ cat x
mkfifo /tmp/question

Question() {
   question="$1"
   echo "$question" >/tmp/question
   until read reponse </tmp/reponse; do :; done
   echo "$reponse"
}

question="question 1"
echo reponse à "$question" : "$(Question "$question")"

question="question 2";
echo reponse à "$question" : "$(Question "$question")"

question="question 3"
echo reponse à "$question" : "$(Question "$question")"

question="Fin"
Question "$question"

rm /tmp/question
$ cat y
mkfifo /tmp/reponse

while true
do
   until read question; do :; done
   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
done </tmp/question

rm /tmp/reponse

À lancer comme ceci, dans un terminal :

./x & ./y

Hors ligne

#13 Le 16/05/2013, à 18:28

dva2tlse

Re : Comment faire dialoguer deux scripts ?

ouais super, merci; j'avais aussi essayé moi-même de les lancer d'une seule fenêtre avec le "&", mais ce qui me pose problème est que les questions viennent d'un script "root" auquel je ne peux pas toucher (hormis les redirections d'E/S sur les FIFO) Donc je vais peut-être être obligé de passer par un niveau de script intermédiaire, ce qui ferait une usine à gaz pour pas grand chose; quant à installer dans mon répertoire personnel, faut voir, mais bien que je sois assez économe en place par rapport aux autres, ça risque quand même de peser un peu; enfin, si ça fait pile ce que je veux, ce serait dommage de s'en priver. Mais je n'ai pas vraiment d'espace "à moi" sur la machine de calcul pour l'installer.
En tous cas, merci à tous, ça m'ouvre l'horizon,
David


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#14 Le 16/05/2013, à 21:33

pingouinux

Re : Comment faire dialoguer deux scripts ?

Je verrais bien une solution, pas très élégante, qui peut marcher si la lecture des données se fait en début de programme.
1) Lancer le programme une première fois, traiter les questions et générer un fichier de réponses en fonction des questions.
2) Tuer le programme (à la fin du script_qui_traite_les_questions).
3) Relancer le programme en lui donnant en entrée le fichier généré.

/usr/expl/bin/qnastran.3.3 | script_qui_traite_les_questions >fichier_qui_contient_les_réponses
/usr/expl/bin/qnastran.3.3 <fichier_qui_contient_les_réponses

Ajouté : Ça ne va pas marcher, car dans l'étape 1 le programme va attendre des réponses, à moins de pouvoir lui fournir un fichier bidon.

Dernière modification par pingouinux (Le 16/05/2013, à 21:40)

Hors ligne

#15 Le 19/05/2013, à 12:24

dva2tlse

Re : Comment faire dialoguer deux scripts ?

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/d13436 … x-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 :

#--------------------------------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


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#16 Le 19/05/2013, à 13:08

pingouinux

Re : Comment faire dialoguer deux scripts ?

dva2tise   #15 a écrit :

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.

J'avais fait des essais un peu similaires, sans succès. Je viens de tester ta proposition, le script root (qnastran chez toi) n'est même pas lancé, et on reste en attente sur la ligne read question.

Hors ligne

#17 Le 21/05/2013, à 09:48

dva2tlse

Re : Comment faire dialoguer deux scripts ?

Bon début de semaine,
oui en effet, je viens de faire des essais ici au boulot, et ça ne rentre pas dans la première question ici non plus. (sur une machine qui me répond ça :  $ uname -a
Linux ispc1011 2.6.18-274.el5 #1 SMP Fri Jul 8 17:36:59 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux )
David (très désemparé)

Dernière modification par dva2tlse (Le 21/05/2013, à 09:53)


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#18 Le 22/05/2013, à 17:49

Altak

Re : Comment faire dialoguer deux scripts ?

Tu pourrais toujours faire le programme en C dont je t'avais parler chez toi puis le compiler en static (en full static) et le ramener au boulot.
Je ne connais pas le flag pour mais on vient de me dire qu'il etait possible de retirer toutes les dépendances a gcc (en mettant ces dépendances de facon static dans l'executable) lors de la compilation et donc permettre une portabilité.

Hors ligne