non mi piace usare wait
perché viene bloccato fino a quando le uscite di processo, che non è l'ideale quando ci sono processi più ad aspettare su come posso' t ottenere un aggiornamento di stato fino al termine del processo corrente. Preferisco utilizzare una combinazione di kill -0
e sleep
a questo.
Dato che un array di pids
è in attesa, utilizzo la funzione waitPids()
sottostante per ottenere un feedback continuo su quali pid sono ancora in attesa di completamento.
declare -a pids
waitPids() {
while [ ${#pids[@]} -ne 0 ]; do
echo "Waiting for pids: ${pids[@]}"
local range=$(eval echo {0..$((${#pids[@]}-1))})
local i
for i in $range; do
if ! kill -0 ${pids[$i]} 2> /dev/null; then
echo "Done -- ${pids[$i]}"
unset pids[$i]
fi
done
pids=("${pids[@]}") # Expunge nulls created by unset.
sleep 1
done
echo "Done!"
}
Quando inizio a un processo in background, aggiungo il suo pid subito alla matrice pids
utilizzando questo sotto funzione di utilità:
addPid() {
desc=$1
pid=$2
echo "$desc -- $pid"
pids=(${pids[@]} $pid)
}
Ecco un esempio che mostra come utilizzare:
for i in {2..5}; do
sleep $i &
addPid "Sleep for $i" $!
done
waitPids
Ed ecco come si presenta il feedback:
Sleep for 2 -- 36271
Sleep for 3 -- 36272
Sleep for 4 -- 36273
Sleep for 5 -- 36274
Waiting for pids: 36271 36272 36273 36274
Waiting for pids: 36271 36272 36273 36274
Waiting for pids: 36271 36272 36273 36274
Done -- 36271
Waiting for pids: 36272 36273 36274
Done -- 36272
Waiting for pids: 36273 36274
Done -- 36273
Waiting for pids: 36274
Done -- 36274
Done!
Hai miscapitalized il fa_qualcosa ... nome ;-) –
Got it - che dire quando voglio per assicurarsi che io solo sono eseguire 50 istanze alla volta? E - quando uno di questi processi è terminato, assicurati che venga generato ancora 1 altro. – Greg
Usa il comando di bash 'jobs'. –