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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 . D'ailleurs, si je fais ceci directement dans le shell :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 .

Comment expliquer cette différence ?

merci d'avance,
ben


voici la trace :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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