nie lubię za pomocą wait
ponieważ pobiera zablokowane aż do wyjścia procesu, który nie jest idealny, gdy istnieje wielu proces czekać na jak mogę” t uzyskać aktualizację statusu do czasu zakończenia bieżącego procesu. Wolę używać do tego kombinacji kill -0
i sleep
.
Przy oczekiwaniu na tablicę z pids
używam poniższej funkcji waitPids()
, aby uzyskać ciągłe informacje zwrotne na temat tego, które pidy wciąż oczekują na zakończenie.
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!"
}
Kiedy rozpocząć proces w tle, od razu dodać swój PID do tablicy pids
stosując ten poniżej funkcji użyteczności:
addPid() {
desc=$1
pid=$2
echo "$desc -- $pid"
pids=(${pids[@]} $pid)
}
Oto przykład, który pokazuje, jak używać:
for i in {2..5}; do
sleep $i &
addPid "Sleep for $i" $!
done
waitPids
A oto jak wygląda zwrotne:
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!
pan miscapitalized się do_something ... nazwa ;-) –
Got It - co, kiedy chcę się upewnić, jestem tylko uruchamianie 50 wystąpień na raz? I - gdy jeden z tych procesów zostanie ukończony, upewnij się, że pojawiło się 1 więcej. – Greg
Użyj wbudowanego skryptu 'jobs' bash. –