qsub en script shell : FOUND=$(qstat | grep -c "$JOB_ID") erreur
salut à tous,
j'utilise un script shell qui lance un programme en qsub.
Pour forcer à attendre la fin de l'exécution du programme en qsub, je compte le nombre de lignes résultant de la commande qstat avec un grep -c dans une boucle et je fais dormir (sleep) mon script tant que le programme lancé en qstat n'est pas terminé, c'est à dire que le nombre de lignes n'est pas 0.
voici le code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
#execution du script en qsub
JOBID=`qsub -q $QUEUE -o /tmp/$NAME.out -e /tmp/$NAME.err $SCRIPTS/$NAME`
echo "jobid : $JOBID "
#pour forcer a attendre la fin de l execution de qstat
FOUND=$(qstat | grep -c "$JOB_ID") #count row with right job id
sleep 5 #temporisation
echo "found here : $FOUND"
while [ $FOUND -ne 0 ] # when no more matching row, job is over
do
sleep 3 #go to bed for 3 seconds
echo -n '.'
#FOUND=`qstat -r | grep "$JOB_ID" | wc -l`
FOUND=$(qstat | grep -c "$JOB_ID")
done
echo "found value after : $FOUND"
###### Reprise du script ###### |
mon problème est le suivant, la variable $FOUND a pour valeur : 4,5, ou 6 alors qu'elle devrait avoir pour valeur 1 uniquement, puisqu'il n'y a qu'un job soumis avec l'id indiqué en qsub :cry:. D'ailleurs, si je fais ceci directement dans le shell :
Code:
1 2
|
while ( true ) do qstat | grep -c "monjobid.monserveur" ; done; |
J'obtiens 1 puis 0 quand le job a fini de tourner, ce qui est normal :roll:.
Comment expliquer cette différence ?
merci d'avance,
ben :ccool:
voici la trace :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
#pour forcer a attendre la fin de l execution de qstat avant de faire le chmod sinon erreur
FOUND=`qstat | grep "$JOB_ID" | wc -l` #count row with right job id
qstat | grep "$JOB_ID" | wc -l
++ qstat
++ wc -l
++ grep ''
+ FOUND=4
sleep 5 #temporisation
+ sleep 5
found here : 4
echo "found here : $FOUND"
+ echo 'found here : 4'
while [ $FOUND -ne 0 ] # when no more matching row, job is over
do
sleep 3 #go to bed for 3 seconds
echo -n '.'
#FOUND=`qstat -r | grep "$JOB_ID" | wc -l`
FOUND=$(qstat | grep -c "$JOB_ID")
done
+ '[' 4 -ne 0 ']'
+ sleep 3
.+ echo -n .
qstat | grep -c "$JOB_ID"
++ qstat
++ grep -c ''
+ FOUND=4
+ '[' 4 -ne 0 ']'
+ sleep 3
.+ echo -n .
qstat | grep -c "$JOB_ID"
++ qstat
++ grep -c ''
+ FOUND=4
+ '[' 4 -ne 0 ']'
+ sleep 3
.+ echo -n .
qstat | grep -c "$JOB_ID"
++ qstat
++ grep -c ''
+ FOUND=4
+ '[' 4 -ne 0 ']'
+ sleep 3
.+ echo -n .
qstat | grep -c "$JOB_ID"
++ qstat
++ grep -c ''
+ FOUND=4
+ '[' 4 -ne 0 ']'
+ sleep 3
.+ echo -n .
qstat | grep -c "$JOB_ID"
++ qstat
++ grep -c ''
+ FOUND=4
+ '[' 4 -ne 0 ']'
+ sleep 3
.+ echo -n .
qstat | grep -c "$JOB_ID"
++ qstat
++ grep -c ''
+ FOUND=4
+ '[' 4 -ne 0 ']'
+ sleep 3
.+ echo -n .
qstat | grep -c "$JOB_ID"
++ qstat
++ grep -c ''
+ FOUND=4
+ '[' 4 -ne 0 ']'
+ sleep 3
.+ echo -n .
qstat | grep -c "$JOB_ID"
++ qstat
++ grep -c ''
+ FOUND=4
+ '[' 4 -ne 0 ']'
+ sleep 3
.+ echo -n .
qstat | grep -c "$JOB_ID"
++ qstat
++ grep -c ''
+ FOUND=4
+ '[' 4 -ne 0 ']'
+ sleep 3
.+ echo -n .
qstat | grep -c "$JOB_ID"
++ qstat
++ grep -c ''
+ FOUND=4
+ '[' 4 -ne 0 ']'
+ sleep 3
.+ echo -n .
qstat | grep -c "$JOB_ID"
++ qstat
++ grep -c ''
+ FOUND=4
+ '[' 4 -ne 0 ']'
ETC |
nommer les variables comme il faut, c'est mieux ...
Je viens de revérifier : ma variable $JOBID n'est pas vide :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
+ JOBID=81.mon_serveur
jobid : 81.mon_serveur
+ echo 'jobid : 81.mon_serveur '
++ qstat
++ grep -c ''
+ FOUND=4
+ sleep 5
found here : 4
+ echo 'found here : 4'
+ '[' 4 -ne 0 ']'
+ sleep 3
.
+ echo .
++ qstat
++ grep -c ''
+ FOUND=4 |
si quelqu'un a une idée ... :(
ben ;)
une sombre histoire de nom de variables ...
je viens de trouver mon erreur :
J'avais déclaré :
Code:
FOUND=$(qstat | grep -c "$JOBID")
et je faisais mon grep sur $JOB_ID :
Code:
1 2 3 4 5 6 7 8 9
|
while [ $FOUND -ne 0 ] # when no more matching row, job is over
do
sleep 3 #go to bed for 3 seconds
echo "."
FOUND=$(qstat | grep -c "$JOB_ID")
qstat
echo "-"
done |
En mettant le même nom de variable partout ça va tout de suite mieux :roll::roll:
Merci à toi, Zipe31, tu m'as mis sur la voie :ccool:!
à bientôt,
ben