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 GNU Discussion :

Variables et commandes simultanées


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 7
    Par défaut Variables et commandes simultanées
    Bonjour,

    Je débute en bash (je m'y suis mis il y a 15 jours).
    A partir d'un serveur, je veux lancer 2 commandes de calcul MD5 de tres gros fichiers sur 2 autres serveurs (en ssh) et récupérer ces MD5 dans des variables pour les comparer.
    Si les commandes s'executent en série, je n'ai pas de problème, mais dès que je veux paralleliser les commandes, je me retrouve avec des variables vides, et je n'arrive pas à m'en sortir (j'ai essayer des boucles, des wait etc.)

    ceci fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MD5FichierServeurA=$(ssh -l root ipserveurA "md5sum '$CheminFichierSurLeServeurA'")
    MD5FichierServeurB=$(ssh -l root ipserveurB "md5sum '$CheminFichierSurLeServeurB'")
    ceci ne fonctionne pas (la commande de calcul est bien envoyée à chaque serveur en simultanée, mais les variables MD5blabla restent deseperement vide:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MD5FichierServeurA=$(ssh -l root ipserveurA "md5sum '$CheminFichierSurLeServeurA'")&
    MD5FichierServeurB=$(ssh -l root ipserveurB "md5sum '$CheminFichierSurLeServeurB'")&
    wait
    Certains fichiers pouvant demander pas loin 1/4h de calcul, le lancement en // me ferait gagner pas mal de temps.
    Si quelqu'un sait comment je peux m'en sortir...

  2. #2
    Membre Expert
    Avatar de Escapetiger
    Homme Profil pro
    Administrateur système Unix - Linux
    Inscrit en
    Juillet 2012
    Messages
    1 556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur système Unix - Linux

    Informations forums :
    Inscription : Juillet 2012
    Messages : 1 556
    Par défaut
    Citation Envoyé par largentula Voir le message
    ceci ne fonctionne pas (la commande de calcul est bien envoyée à chaque serveur en simultanée, mais les variables MD5blabla restent deseperement vide:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MD5FichierServeurA=$(ssh -l root ipserveurA "md5sum '$CheminFichierSurLeServeurA'")&
    MD5FichierServeurB=$(ssh -l root ipserveurB "md5sum '$CheminFichierSurLeServeurB'")&
    wait
    Certains fichiers pouvant demander pas loin 1/4h de calcul, le lancement en // me ferait gagner pas mal de temps.
    Si quelqu'un sait comment je peux m'en sortir...
    Bonjour, je pencherai pour un problème de syntaxe à savoir, rajouter pour chaque variable un espace entre la dernière parenthèse et le "&" ou bien inclure le "&" avec un espace à l'intérieur de $(ssh ... & ) . Je ne peux pas tester ici.

    EDIT : troisième suggestion, faire un echo explicite de tes variables echo $MD5FichierServeurN avant le wait (pour "nettoyer" l'affichage du type [pid]+ Done )
    « Developpez.com est un groupe international de bénévoles dont la motivation est l'entraide au sens large » (incl. forums developpez.net)
    Club des professionnels en informatique

    Liste des balises BB

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Escapetiger Voir le message
    Bonjour, je pencherai pour un problème de syntaxe à savoir, rajouter pour chaque variable un espace entre la dernière parenthèse et le "&" ou bien inclure le "&" avec un espace à l'intérieur de $(ssh ... & ) . Je ne peux pas tester ici.
    Ben... je pense pas que ça puisse marcher comme ça
    Si tu fais A=$({ sleep 10; echo A; } &), l'instruction entière doit être terminée avant de rendre la main. Et ça dure bien 10 secondes!
    Impossible de paralléliser de cette manière.

    Pas trop le temps de regarder, mais je crois qu'il vaut mieux chercher du côté des exemples de fifo avec mkfifo.

    En gros, on ouvre 2 fifos sur lesquels on commence à lire en background.
    Et on lance les process en background qui vont écrire dedans...

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 7
    Par défaut
    Je confirme que le & avant la ) ne fonctionne pas, les process sont lancés les uns à la suite des autres.
    l'espace après la ) et avant le & ne change rien non plus...
    mais merci tout même pour les suggestions.

    je vais donc regarder du coté fifo et mkfifo (que je ne connais pas du tout) en esperant ne pas être obligé de monter une usine à gaz (et que ce ne soit pas trop compliqué...)

  5. #5
    Membre Expert
    Avatar de Escapetiger
    Homme Profil pro
    Administrateur système Unix - Linux
    Inscrit en
    Juillet 2012
    Messages
    1 556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur système Unix - Linux

    Informations forums :
    Inscription : Juillet 2012
    Messages : 1 556
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Ben... je pense pas que ça puisse marcher comme ça
    Si tu fais A=$({ sleep 10; echo A; } &), l'instruction entière doit être terminée avant de rendre la main. Et ça dure bien 10 secondes!
    Impossible de paralléliser de cette manière.

    Pas trop le temps de regarder, mais je crois qu'il vaut mieux chercher du côté des exemples de fifo avec mkfifo.

    En gros, on ouvre 2 fifos sur lesquels on commence à lire en background.
    Et on lance les process en background qui vont écrire dedans...
    Merci jack-ft, effectivement; en poussant la logique de la fin de l'instruction entière, je me demande si A=$({ sleep 10; echo A; } &)& peut fonctionner ou ne fait que répéter "l'erreur".
    « Developpez.com est un groupe international de bénévoles dont la motivation est l'entraide au sens large » (incl. forums developpez.net)
    Club des professionnels en informatique

    Liste des balises BB

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Escapetiger Voir le message
    Merci jack-ft, effectivement; en poussant la logique de la fin de l'instruction entière, je me demande si A=$({ sleep 10; echo A; } &)& peut fonctionner ou ne fait que répéter "l'erreur".
    Ben... je vois pas comment on pourrait "affecter" une valeur à A en background ?!?!? et rendre la main aussitôt et récupérer la valeur affectée (quand?) alors que les instructions vont continuer à se dérouler alors que A ne serait pas encore valuée...
    ça peut vraiment pas marcher comme ça!

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 7
    Par défaut
    j'ai tenté le fifo comme indiqué par jack-ft :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
       mkfifo fifoA fifoB
       ssh -l root ipserveurA "md5sum '$cheminduFichierserveurA'" > fifoA &
     
       ssh -l root ipserveurB "md5sum '$cheminduFichierserveurB'" > fifoB &
     
       while test -z "$MD5fichierserveurA" && test -z "$MD5fichierserveurB"
       do
               read MD5fichierserveurA < fifoA
                read MD5fichierserveurB < fifoB
        done
        rm fifoA
        rm fifoB
    j'ai bien des resultats à la fin dans mes variables, mais seulement les ssh... "md5sum ..." ne s'executent pas en // mais l'un après l'autre... j'ai dû oublier quelque chose...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Variables] Concaténation commande AWK
    Par amazigh42 dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 27/04/2015, 11h06
  2. Variable pour commande dans script en vrac après 1re utilisation
    Par Jipété dans le forum Shell et commandes GNU
    Réponses: 10
    Dernier message: 09/01/2014, 00h57
  3. [PowerShell] passer variable dans commande
    Par sacan dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 31/12/2012, 16h27
  4. Comment réaliser des commandes simultanément ?
    Par winnie82 dans le forum Langage
    Réponses: 5
    Dernier message: 18/08/2006, 14h04
  5. Réponses: 2
    Dernier message: 23/03/2004, 11h24

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