Это мое грубое решение:
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
}
Идея состоит в том, чтобы использовать «задания», чтобы узнать, сколько детей активно в фоновом режиме и ждать, пока это число не упадет (ребенок выйдет). После того, как ребенок существует, можно запустить следующую задачу.
Как вы можете видеть, существует также немного дополнительной логики, чтобы избежать одновременного запуска одних и тех же экспериментов / команд. Он выполняет эту работу для меня. Однако эта логика может быть либо пропущена, либо улучшена (например, отметьте отметки времени создания файла, параметры ввода и т. Д.).