
Aqui está um script escrito para bash:
#!/bin/bash
sleep 1 &
sleep 2 &
sleep 3 &
for t in {10..0}
do
# jobs
echo "Waiting("$t")..."
JCNT=`jobs | wc -l`
echo "JCNT="$JCNT
if [ $JCNT -eq 0 ]; then
break
fi
sleep 1
done
exit 0
Funciona por 10 segundos, mas não por 3 segundos como esperado. Mas se você descomentar o comando "jobs", ele funciona bem. Não tenho ideia do porquê. Pode me ajudar?
A saída do script com "jobs" comentou:
Waiting(10)...
JCNT=3
Waiting(9)...
JCNT=2
Waiting(8)...
JCNT=1
Waiting(7)...
JCNT=1
Waiting(6)...
JCNT=1
Waiting(5)...
JCNT=1
Waiting(4)...
JCNT=1
Waiting(3)...
JCNT=1
Waiting(2)...
JCNT=1
Waiting(1)...
JCNT=1
Waiting(0)...
JCNT=1
E com o comando "jobs" não comentado:
[1] Running sleep 1 &
[2]- Running sleep 2 &
[3]+ Running sleep 3 &
Waiting(10)...
JCNT=3
[1] Done sleep 1
[2]- Running sleep 2 &
[3]+ Running sleep 3 &
Waiting(9)...
JCNT=2
[2]- Done sleep 2
[3]+ Running sleep 3 &
Waiting(8)...
JCNT=1
[3]+ Done sleep 3
Waiting(7)...
JCNT=0
ADICIONADO
Modifiquei o script desta forma:
#!/bin/bash
sleep 1 &
sleep 2 &
sleep 3 &
for t in {10..0}
do
KKK=`jobs`
echo $KKK
echo "Waiting("$t")..."
JCNT=`jobs | wc -l`
echo "JCNT="$JCNT
if [ $JCNT -eq 0 ]; then
break
fi
sleep 1
done
exit 0
...e descobri que há informações sobre o último trabalho realizado:
[3] Done sleep 3
Chamar "trabalhos" simplesmente elimina a lista de trabalhos concluídos. Fazer "jobs|wc -l" é a maneira errada de contar empregos ativos. O caminho certo é "jobs -r|wc -l".
Responder1
Não responde à sua pergunta, apenas como dica:
quando você executa o trabalho separadamente no loop. Funciona/conta conforme o esperado.
Mas não tenha ideia do porquê, por enquanto.