Script sh et parallélisme

Fermé
bernard - 11 févr. 2010 à 00:37
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 16 févr. 2010 à 06:30
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.
A voir également:

2 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896
11 févr. 2010 à 08:58
Salut,

Et pourquoi pas plutôt une boucle while en début de script ?

i=0
while [ "$i" -lt 5 ]
do
...
((i++))
done

0
slt jipicy, je ne comprends pas du tout ton introduction de boucle while, je rappelle que le script s'appelle avec un seul argument qui est le fichier liste. Donc la commande shell précise est la suitvante:

./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...?
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896
11 févr. 2010 à 13:18
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$

;-))
0
bon tu as parfaitement raison jipicy merci, mais j'ai quand même une question : est ce possible de faire ce que tu as fait avec des sleep? car j'ai essayé mais sans succès...
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896 > bernard
11 févr. 2010 à 13:44
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 :

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$

;-))
0
bernard > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
11 févr. 2010 à 13:56
ton while permet du parallélisme entre l'éxécution des scripts tu es d'accord?
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896 > bernard
11 févr. 2010 à 17:48
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) ;-\
0
bernard > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
15 févr. 2010 à 23:17
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
0