[SH/BASH] PB de boucle - Conseil & Help SVP

Résolu/Fermé
F_Pignon Messages postés 23 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 29 mai 2008 - 25 sept. 2007 à 11:34
F_Pignon Messages postés 23 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 29 mai 2008 - 27 sept. 2007 à 14:57
Bonjour à tous,

Dans un petit script shell effectuant quelques commandes sur des fichiers et qui prend un peu de temps, j'aimerais pouvoir afficher tout bêtement un repère qui permet de controler que le traitrement est en cours;
à savoir une succession de points (par ex) qui s'affichent à intervalles réguliers à la suite du lancement du script, et ce, pendant la durée du traitement .

Voici la structure de mon script (je débute en SH) et ce que j'ai essayé de faire pour afficher mon "sablier" (mis en gras) :

toto.sh :
#!/bin/sh
echo ">>> Préparation des fichiers de parametres en cours "
while
cat FIC01 FIC02 | grep -v "motif" | sed "s/motif1/motif2/g" | sort -u > FIC03
perl fichier.pl FIC03 > FIC04
etc... (<autres commandes dans le même genre>)
do
echo ". "
done
echo ">>> Fichiers de parametres générés."

Je voudrais donc obtenir ceci :
[toto@localhost PARAM]$ ./toto.sh
>>> Préparation des fichiers de parametres en cours . . . . . . . . . . . . <etc jusqu'à ce que les commandes soient terminées>
>>> Fichers de parametres générés
[toto@localhost PARAM]$ 

Or, dans l'état actuel j'obtiens ça :
[toto@localhost PARAM]$ toto.sh
>>> Préparation des fichiers de parametres
.
.
.
.


... sans s'arreter.

Si quelqu'un pouvait me conseiller et m'aider

Merci d'avance
(PS: > ma version bash : 3.00.16)

16 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 897
25 sept. 2007 à 11:42
Salut,
do 
echo -e ".\c"
sleep 1
done
;-))
0
F_Pignon Messages postés 23 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 29 mai 2008 1
25 sept. 2007 à 12:18
Bonjour jipicy,

Tout d'abord merci pour ta réponse rapide :)
Mais j'ai toujours un souci..
Maintenant j'ai bien l'affichage de "points-successifs-sur-une-ligne-à-intervalles-reguliers" comme je le souhaitais :) mais ça boucle sans arrêt :( et ça ne sort jamais de la boucle : du coup, ça génére mon fichier, ça affiche un point, ça génére à nouveau mon fichier, ça affiche un point, etc.

J'ai essayé d'insérer un break pour sortir de la boucle :
do 
echo -e ".\c"
sleep 1
break
done

mais là il n'y a qu'un point qui s'affiche et puis le script s'arrête puisque le fichier est généré...

Une piste pour boucler sur le point et pas sur la génération du fichier ?
0
dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
25 sept. 2007 à 14:08
The syntax of the while command is:
while test-commands; do consequent-commands; done

while a besoin d'une condtion pour terminer
0
F_Pignon Messages postés 23 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 29 mai 2008 1
25 sept. 2007 à 14:19
Bonjour Dubcek,

En effet, ici ma condition serait :
"tant que les commandes ne sont pas terminées [et donc le fichier généré]"
C'est ce que j'essayais de faire ici :
while 
<condition>
do
echo -e ".\c"
sleep 1
done


sachant que <condition> correspond aux instructions suivantes :
cat FIC01 FIC02 | grep -v "motif" | sed "s/motif1/motif2/g" | sort -u > FIC03
perl fichier.pl FIC03 > FIC04
etc... (<autres commandes dans le même genre>)


le problème c'est que visiblement une fois que les commandes sont terminées et le fichier généré, la boucle ne s'arrête pas :(

Merci de ton aide en tout cas et si tu as une autre piste ? et aussi d'autres CCMnautes ?
je suis preneur de tout avis, aide et conseils :))
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
25 sept. 2007 à 14:39
quelque chose comme cela :

#!/bin/sh
echo ">>> Préparation des fichiers de parametres en cours "
while true ; do sleep 1 ; echo -e  ".\c"  ; done &
PID=$!

grep -v "motif" FIC01 FIC02 | sed "s/motif1/motif2/g" | sort -u > FIC03
perl fichier.pl FIC03 > FIC04
etc... (<autres commandes dans le même genre>)

kill -9 $PID

echo ">>> Fichiers de parametres générés."
0
F_Pignon Messages postés 23 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 29 mai 2008 1
25 sept. 2007 à 14:56
Merci Dubcek !
Visiblement cette solution fonctionne, j'ai simplement ajouté l'option "-e" après le echo dans
echo ".\c"
comme l'avait suggéré jipicy
Sans abuser de ta patience Dubcek j'ai encore une petite question :
A la fin de l'exécution du script j'ai la confirmation du kill -9 $PID :
[toto@localhost PARAM]$ ./toto.sh
>>> Préparation des fichiers de parametres en cours . . 
. . . . . . . . . . 
./toto.sh: line 45: 15030 Killed                  while true; do
    sleep 1; echo -e ".\c";
done
>>> Fichers de parametres générés
[toto@localhost PARAM]$ 

Comment pourrais-je faire pour que cela ne s'affiche pas ? (si cela est possible...)
D'avance merci
0
dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
25 sept. 2007 à 15:10
j'avais mis le -e ?. Comme ça, il devrait être silencieux : kill -9 $PID > /dev/null 2>&1
0
F_Pignon Messages postés 23 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 29 mai 2008 1
25 sept. 2007 à 15:21
le "-e" c'est moi qui l'ai rajouté de façon à ce que les points s'affichent sur une même ligne et non un par ligne (merci jipicy :) )

La commande kill -9 $PID > /dev/null 2>&1 ne fonctionne pas de mon côté :(
Toutefois pourrais-tu m'expliquer brièvement ce que fais cette commande (après le "$PID") stp ?

et du coup, aurais-tu une autre idée...?


Merci
0
dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
25 sept. 2007 à 15:39
le \c élimine le saut de ligne et le -e autorise l'interpretation des \x
kill -9 $PID > /dev/null 2>&1 : envoie le standard output dans /dev/null donc le detruit et envoie les erreurs au même endrot

essayons ça avec un fichier pour déclancher l'arrêt :

#!/bin/sh
echo ">>> Préparation des fichiers de parametres en cours "
rm -f ABORT ; while [ ! -f ABORT ] ; do sleep 1 ; echo -e ".\c" ; done &

grep -v "motif" FIC01 FIC02 | sed "s/motif1/motif2/g" | sort -u > FIC03
perl fichier.pl FIC03 > FIC04
etc... (<autres commandes dans le même genre>)

touch ABORT

echo ">>> Fichiers de parametres générés."
0
F_Pignon Messages postés 23 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 29 mai 2008 1
25 sept. 2007 à 15:50
Merci Dubcek ,

Ca fonctionne presque , j'ai ceci qui s'affiche :
[toto@localhost PARAM]$ ./toto.sh
>>> Préparation des fichiers de parametres en cours . . 
. . . . . . . . . . 
>>> Fichers de parametres générés
[toto@localhost PARAM]$ 

Je pensais que tout était OK mais.....
J'ai l'affichage des points qui continue :
[toto@localhost PARAM]$ ./toto.sh
>>> Préparation des fichiers de parametres en cours . . 
. . . . . . . . . . 
>>> Fichers de parametres générés
[toto@localhost PARAM]$ . . . . . . . . . . 

et je suis obligé de "killer" la console car il ne s'arrête plus :(

Vois tu d'où ça vient..?
0
dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
25 sept. 2007 à 16:05
est ce que entre
rm -f ABORT ; while [ ! -f ABORT ] ; do sleep 1 ; echo -e ".\c" ; done &
et
touch ABORT
il y a un changement de répertoire (cd) ?

essayer ca :
rm -f /tmp/ABORT ; while [ ! -f /tmp/ABORT ] ; do sleep 1 ; echo -e ".\c" ; done &
...
touch /tmp/ABORT
0
F_Pignon Messages postés 23 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 29 mai 2008 1
25 sept. 2007 à 16:13
non ça fonctionne ! Au temps pour moi..

J'avais copié/collé la solution de tout a l'heure sauf le "touch ABORT" que j'avais rajouté a la main vu qu'il prend place plus loin dans me code et j'avais fait une faute de frappe (j'avais mis ARBORT) du coup il n'était jamais créé, et la condition restait toujours vraie... voilà tout

Donc un GRAND merci Dubcek pour ton aide et ta patience !

A bientot!
0
dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
25 sept. 2007 à 16:18
ce fut un plaisir ...
soyons puristes. Il va y avoir un problème si ce script tourne plusieurs fois en parallèle à cause du nom du fichier ABORT.
il faudrait lui donner un nom unique, par ex. ABORT$$
ou $$ est le numéro du processus
0
F_Pignon Messages postés 23 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 29 mai 2008 1
25 sept. 2007 à 19:46
Désolé je n'étais plus devant ma machine,
OK mais comment faire pour numéroter le fichier avec le numéro de processus ..?

Sinon j'ai inversé la méthode en effectuant les commandes tant que le fichier existe, et en le supprimant à la fin,
ce qui donne :
#!/bin/sh 
echo ">>> Préparation des fichiers de parametres en cours " 
touch ABORT ; while [ -f ABORT ] ; do sleep 1 ; echo -e ".\c" ; done &
 
cat FIC01 FIC02 | grep -v "motif" | sed "s/motif1/motif2/g" | sort -u > FIC03 
perl fichier.pl FIC03 > FIC04 
etc... (<autres commandes dans le même genre>) 
 
rm -f ABORT 
 
echo ">>> Fichiers de parametres générés."

Qu'en dis-tu ? Il me semble que ça permet de ne plus avoir de traces de l'"astuce"
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 897
25 sept. 2007 à 20:07
Re-

OK mais comment faire pour numéroter le fichier avec le numéro de processus ..?
#!/bin/sh 
echo ">>> Préparation des fichiers de parametres en cours " 
touch ABORT$$ ; while [ -f ABORT$$ ] ; do sleep 1 ; echo -e ".\c" ; done &
 
cat FIC01 FIC02 | grep -v "motif" | sed "s/motif1/motif2/g" | sort -u > FIC03 
perl fichier.pl FIC03 > FIC04 
etc... (<autres commandes dans le même genre>) 
 
rm -f ABORT$$
 
echo ">>> Fichiers de parametres générés."
;-))
0
F_Pignon Messages postés 23 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 29 mai 2008 1
27 sept. 2007 à 14:57
Bonjour jipicy,

Désolé pour ma réponse tardive mais MERCI

:)


Récapitulatif de la solution à mon pb :
#!/bin/sh 
echo ">>> Préparation des fichiers de parametres en cours " 
touch ABORT$$ ; while [ -f ABORT$$ ] ; do sleep 1 ; echo -e ".\c" ; done &
 
<DIVERSES COMMANDES>

rm -f ABORT$$

echo ">>> Fichiers de parametres générés."
0