Это мое грубое решение:
function run_task {
cmd=$1
output=$2
concurency=$3
if [ -f ${output}.done ]; then
# experiment already run
echo "Command already run: $cmd. Found output $output"
return
fi
count=`jobs -p | wc -l`
echo "New active task #$count: $cmd > $output"
$cmd > $output && touch $output.done &
stop=$(($count >= $concurency))
while [ $stop -eq 1 ]; do
echo "Waiting for $count worker threads..."
sleep 1
count=`jobs -p | wc -l`
stop=$(($count > $concurency))
done
}
Идея состоит в том, чтобы использовать «задания», чтобы увидеть, сколько детей активно в фоновом режиме, и подождать, пока это число не упадет (ребенок выходит). Когда ребенок существует, можно запустить следующую задачу.
Как вы можете видеть, есть также немного дополнительной логики, чтобы избежать многократного выполнения одних и тех же экспериментов / команд. Он выполняет свою работу за меня. Однако эту логику можно либо пропустить, либо улучшить (например, проверить метки времени создания файла, входные параметры и т. Д.).