Script sh et parallélisme

bernard -  
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   -
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.
Configuration: Linux
Mozilla 1.9.0.16

2 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

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

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

    0
    1. bernard
       
      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
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
    1. bernard
       
      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
    2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > bernard
       
      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
    3. bernard > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
       
      ton while permet du parallélisme entre l'éxécution des scripts tu es d'accord?
      0
    4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > bernard
       
      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
    5. bernard > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
       
      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