Eu não sei de uma mão, mas você poderia fazer isso com Bash sem muito trabalho. Eu colocaria cada um dos processos foo em um grupo de processos. Você pode capturar SIGINT no pai e matar o grupo de processos com kill -pgid
(Negativo antes do número do grupo de processos). Você também pode iniciá-los todos como trabalhos. Então todos eles correm de uma vez (basicamente). Finalmente, você poderia fazer um loop sobre a saída de jobs a cada x segundos (dormir no loop) e obter a contagem, se a contagem for menor que o número de processos foo, do que você pode acionar outro. certeza de que nenhum está parado, etc.).
Uma versão aproximada pode ser algo como:
#!/bin/bash
command=$1
n_job=$2
function kill_jobs {
echo traped
for job in $(jobs -p); do
echo killing $job
kill $job
done
}
trap 'kill_jobs; exit' SIGINT
while true; do
current_jobs=$(jobs -pr)
x=0;
for job in $current_jobs; do
(( x++ ))
done;
jobs_to_run=$(($n_job - $x))
for (( y = 0; y < $jobs_to_run; y++ )); do
$command &
done
x=0
sleep 5
done
Você também pode encontrar coisas parecidas na seção "Proccesses and Concurrency" do Pythton for Unix e Linux System Adminsitration.