Script sh et parallélisme
bernard
-
jipicy Messages postés 41342 Statut Modérateur -
jipicy Messages postés 41342 Statut Modérateur -
Bonjour, j'ai le script shell suivant :
#! /bin/bash
if [ $# -ne 1 ] ; then
echo Il faut 1 parametre
exit 1
fi
if [ ! -f "$1" ] ; then
echo Le 1er parametre doit etre un fichier
exit 1
fi
read fic1 fic2 fic3 < "$1"
read nb1 < $fic1
read nb2 < $fic2
touch $fic3
echo $nb2 > $fic1
echo $nb1 > $fic2
res=`expr $nb1 + $nb2`
read val < $fic3
if [ -z "$val" ] ; then
echo $res > $fic3
else
echo `expr $nb1 \* $val` > $fic3
fi
Dans mon répertoire j'ai à la base un fichier liste qui contient f1 f2 f3 et f1 contient 1 et f2 contient 4.
J'éxécute ce script 5 fois de suite, j'ai f1=4, f2=1 et f3=80, jusqu'ici facile.
Je souhaite modifier ce script pour obtenir le même résultat mais si j'éxécute les scripts en parallèle (avec &...). Je pense qu'il faut utiliser des sleep et des synchronisations qu'en pensez vous?
merci pour votre aide.
#! /bin/bash
if [ $# -ne 1 ] ; then
echo Il faut 1 parametre
exit 1
fi
if [ ! -f "$1" ] ; then
echo Le 1er parametre doit etre un fichier
exit 1
fi
read fic1 fic2 fic3 < "$1"
read nb1 < $fic1
read nb2 < $fic2
touch $fic3
echo $nb2 > $fic1
echo $nb1 > $fic2
res=`expr $nb1 + $nb2`
read val < $fic3
if [ -z "$val" ] ; then
echo $res > $fic3
else
echo `expr $nb1 \* $val` > $fic3
fi
Dans mon répertoire j'ai à la base un fichier liste qui contient f1 f2 f3 et f1 contient 1 et f2 contient 4.
J'éxécute ce script 5 fois de suite, j'ai f1=4, f2=1 et f3=80, jusqu'ici facile.
Je souhaite modifier ce script pour obtenir le même résultat mais si j'éxécute les scripts en parallèle (avec &...). Je pense qu'il faut utiliser des sleep et des synchronisations qu'en pensez vous?
merci pour votre aide.
A voir également:
- Script sh et parallélisme
- Script vidéo youtube - Guide
- Mas script - Accueil - Windows
- Ghost script - Télécharger - Polices de caractères
- Script cmd - Guide
- Script les visiteurs pdf - Forum PDF
2 réponses
Salut,
Et pourquoi pas plutôt une boucle while en début de script ?
Et pourquoi pas plutôt une boucle while en début de script ?
i=0 while [ "$i" -lt 5 ] do ... ((i++)) done
Comme une démonstration vaut mieux qu'un long discours...
;-))
jp@MDK:~/tmpfs ssh$ ls f1 f2 foo.sh liste jp@MDK:~/tmpfs ssh$ cat foo.sh #! /bin/bash i=0 while [ "$i" -lt 5 ] do if [ $# -ne 1 ] ; then echo Il faut 1 parametre exit 1 fi if [ ! -f "$1" ] ; then echo Le 1er parametre doit etre un fichier exit 1 fi read fic1 fic2 fic3 < "$1" read nb1 < $fic1 read nb2 < $fic2 touch $fic3 echo $nb2 > $fic1 echo $nb1 > $fic2 res=`expr $nb1 + $nb2` read val < $fic3 if [ -z "$val" ] ; then echo $res > $fic3 else echo `expr $nb1 \* $val` > $fic3 fi ((i++)) done jp@MDK:~/tmpfs ssh$ cat liste f1 f2 f3 jp@MDK:~/tmpfs ssh$ cat f1 1 jp@MDK:~/tmpfs ssh$ cat f2 4 jp@MDK:~/tmpfs ssh$ chmod u+x foo.sh jp@MDK:~/tmpfs ssh$ ./foo.sh Il faut 1 parametre jp@MDK:~/tmpfs ssh$ ./foo.sh liste jp@MDK:~/tmpfs ssh$ ls f1 f2 f3 foo.sh* liste jp@MDK:~/tmpfs ssh$ cat f1 4 jp@MDK:~/tmpfs ssh$ cat f2 1 jp@MDK:~/tmpfs ssh$ cat f3 80 jp@MDK:~/tmpfs ssh$
;-))
Pas avec des "sleep" mais avec la commande "wait".
En enlevant la boucle "while" du script (ce que j'ai rajouté en fait) et en lançant les commandes comme suit :
;-))
En enlevant la boucle "while" du script (ce que j'ai rajouté en fait) et en lançant les commandes comme suit :
jp@MDK:~/tmpfs ssh$ ./foo.sh liste& wait;./foo.sh liste& wait;./foo.sh liste& wait;./foo.sh liste& wait;./foo.sh liste& wait; [1] 5085 [1]+ Done ./foo.sh liste [1] 5088 [1]+ Done ./foo.sh liste [1] 5092 [1]+ Done ./foo.sh liste [1] 5096 [1]+ Done ./foo.sh liste [1] 5100 jp@MDK:~/tmpfs ssh$ ls f1 f2 f3 foo.sh* liste jp@MDK:~/tmpfs ssh$ cat f1 4 jp@MDK:~/tmpfs ssh$ cat f2 1 jp@MDK:~/tmpfs ssh$ cat f3 80 jp@MDK:~/tmpfs ssh$
;-))
Euh... non ;-\
Le while c'est du séquentiel. Même la commande utilisant "&" et "wait" c'est aussi du séquentiel dans la mesure où chaque nouvelle commande "wait" attend l'achèvement de la dernière tâche de fond lancée (&) pour exécuter la prochaine.
Pour ce que tu veux faire, le parallélisme n'est pas possible dans la mesure où chaque script lancée est tributaire du précédent (du moins dans ce que tu veux obtenir au final) ;-\
Le while c'est du séquentiel. Même la commande utilisant "&" et "wait" c'est aussi du séquentiel dans la mesure où chaque nouvelle commande "wait" attend l'achèvement de la dernière tâche de fond lancée (&) pour exécuter la prochaine.
Pour ce que tu veux faire, le parallélisme n'est pas possible dans la mesure où chaque script lancée est tributaire du précédent (du moins dans ce que tu veux obtenir au final) ;-\
excuse moi jipicy mais ton script ne marche pas je suis dsl, j'ai beau l'essayer depuis 1 heure de différente manière rien n'y fait, en voici la preuve:
bernard@moi:~$ echo 1 > f1 ; echo 4 > f2 ; cat liste
f1 f2 f3
bernard@moi:~$ ./exo.sh liste & ./exo.sh liste& ./exo.sh liste& ./exo.sh liste& ./exo.sh liste
[1] 4392
[2] 4393
[3] 4394
[4] 4395
[1] Done ./exo.sh liste
[2] Done ./exo.sh liste
[3]- Done ./exo.sh liste
[4]+ Done ./exo.sh liste
bernard@moi:~$ cat f1
4
bernard@moi:~$ cat f2
1
bernard@moi:~$ cat f3
5120
je ne veux pas 5120 mais 80, et avec exactement la commande que j'ai donné et j'ai essayé 10 fois ton script et rien n'y fait, je me demande comment toi tu as faire pour obtenir le 80 vu qu'on utilise le même script
bernard@moi:~$ echo 1 > f1 ; echo 4 > f2 ; cat liste
f1 f2 f3
bernard@moi:~$ ./exo.sh liste & ./exo.sh liste& ./exo.sh liste& ./exo.sh liste& ./exo.sh liste
[1] 4392
[2] 4393
[3] 4394
[4] 4395
[1] Done ./exo.sh liste
[2] Done ./exo.sh liste
[3]- Done ./exo.sh liste
[4]+ Done ./exo.sh liste
bernard@moi:~$ cat f1
4
bernard@moi:~$ cat f2
1
bernard@moi:~$ cat f3
5120
je ne veux pas 5120 mais 80, et avec exactement la commande que j'ai donné et j'ai essayé 10 fois ton script et rien n'y fait, je me demande comment toi tu as faire pour obtenir le 80 vu qu'on utilise le même script
./script.sh liste & ./script.sh liste& ./script.sh liste& ./script.sh liste& ./script.sh liste
(tu remarques il y a 4 &), donc 4 scripts qui s'éxécutent en parallèle et 1 normalement. Avec cette commande je souhaite obtenir f1=4 f2=1 f3=80.
Je pense en lisant mon livre que je dois utiliser des instructions sleep et de synchronisations, je ne vois pas l'utilité du while ici...?