no me gusta usar wait
porque se bloquea hasta que termina el proceso, lo cual no es ideal cuando existen múltiples procesos que esperar en lo que pueda' Obtener una actualización de estado hasta que finalice el proceso actual. Prefiero usar una combinación de kill -0
y sleep
a esto.
Dada una matriz de pids
para esperar, utilizo la siguiente función waitPids()
para obtener una retroalimentación continua sobre qué pids aún están pendientes de finalizar.
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!"
}
Cuando comienzo un proceso en segundo plano, agrego su PID inmediatamente a la matriz pids
utilizando esta por debajo de la función de utilidad:
addPid() {
desc=$1
pid=$2
echo "$desc -- $pid"
pids=(${pids[@]} $pid)
}
Aquí es un ejemplo que muestra cómo utilizar:
for i in {2..5}; do
sleep $i &
addPid "Sleep for $i" $!
done
waitPids
Y aquí es cómo se ve la retroalimentación:
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!
Usted ha miscapitalized la hacer_algo ... ;-) nombre –
¡Gracias - ¿Qué pasa cuando quiero para asegurarse de que sólo soy ejecutando 50 instancias a la vez? Y, cuando finalice uno de esos procesos, asegúrese de que se genere 1 más. – Greg
Usa el comando 'jobs' bash incorporado. –