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:
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:
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...
Errare humanum est, perseverare diabolicum
Citation:
Envoyé par
largentula
je débute :)
je confirme mais par la logique inverse : j'ai le même résultat depuis que je l'ai mis...
Je ne comprends pas l'interet d'attendre la fin de psB (je ne comprend pas psB tout court), ma variable à déjà a bonne valeur en fin de fonction. C'est une fois que je quite la fonction qu'elle perd sa valeur.
Au delà de mes premières suggestions vraiment mal exprimées :oops: dans lesquelles je me suis fourvoyé comme l'a justement stipulé jack-ft, je propose un nouveau test que je viens de réaliser en local (il ne simule pas la partie ssh -l), avec succès, qui revient sur tes essais initiaux (sans mkfifo et sans appel de fonction, pour conserver l'environnement initial)
En fait, je rebondis sur les préconisations de jack-ft pour la partie wait du pid donné (je pense effectivement que l'on perd le contenu des variables suite aux fermetures des "file descriptor")
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| root@slitaz:~$ cat test.sh
#/bin/bash
#set -xv
varA=$(sleep 40 ; find /home | wc -l &)
wait $! &
varB=$(sleep 30 ; find /var | wc -l &)
wait $! &
varC=$(sleep 10 ; find / | wc -l &)
echo varA $varA varB $varB varC $varC
##wait
##echo apres wait varA $varA
##echo apres wait varB $varB
root@slitaz:~$ ./test.sh
varA 1193 varB 1900 varC 49826 |
Nota: j'ai rajouté une troisième variable intentionnellement; ici ça fonctionne, j'espère qu'après ajustements ce sera le cas dans ta configuration.
Nota bis: pas facile par écrit dans un topic, j'espère avoir été clair à la manière d'un Hubert Reeves quand il parle d'astrophysique (bon OK ! je n'ai pas son niveau de chercheur ni son charisme ;) )
EDIT : ça ne fonctionne pas en fait, il n'y a qu'un pas voire deux (trois ici) entre la ténacité et l'entêtement.
:sm: