Estou tentando criar um script que iniciará muitos comandos em segundo plano. Para cada comando em segundo plano, preciso obter o código de retorno.
Eu tenho tentado o seguinte script:
#!/bin/bash
set -x
pid=()
return=()
for i in 1 2
do
echo start $i
ssh mysql "/root/test$i.sh" &
pid[$i]=$!
done
for i in ${#pid[@]}
do
echo ${pid[$i]}
wait ${pid[$i]}
return[$i]=$?
if [ ${return[$i]} -ne 0 ]
then
echo mail error
fi
done
echo ${return[1]}
echo ${return[2]}
Meu problema é durante o loop de espera; se o segundo pid terminar antes do primeiro, não poderei obter o código de retorno.
Eu sei que posso executar wait pid1 pid2, mas com este comando não consigo obter o código de retorno de todos os comandos.
Qualquer ideia ?
A resposta de Stéphane é boa, mas eu preferiria
que iterará sobre as chaves da
pid
matriz, independentemente de quais entradas ainda existam, para que você possa adaptá-lo, sair do loop e reiniciar o loop inteiro e funcionará. E você não precisa de valores consecutivosi
para começar.Obviamente, se você estiver lidando com milhares de processos, talvez a abordagem de Stépane seja fracamente mais eficiente quando você tiver uma lista não esparsa.
fonte