Divida os URLs em um arquivo por host. Em seguida, execute 'parallel -j5' em cada arquivo.
Ou classifique urls e insira um delimitador '\ 0' quando um novo host for encontrado, então divida em '\ 0' e remova '\ 0' enquanto passa isso como um bloco para uma nova instância de paralelo:
sort urls.txt |
perl -pe '(not m://$last:) and print "cat urls.txt | parallel -q -j50 sem --fg --id '{= m://([^/]+):; $_=$1 =}' -j5 ./scan {}
";m://([^/]+): and $last=$1' |
parallel -j10 --pipe --rrs -N1 --recend 'sort urls.txt |
perl -pe '(not m://$last:) and print "cat urls.txt | parallel -q -j50 sem --fg --id '{= m://([^/]+):; $_=$1 =}' -j5 ./scan {}
";m://([^/]+): and $last=$1' |
parallel -j10 --pipe --rrs -N1 --recend '%pre%' parallel -j5 ./scan
' parallel -j5 ./scan
Editar:
Acho que isso funcionará:
%pre% sem
faz parte do GNU Parallel (é uma abreviação de parallel --semaphore
). {= m://([^/]+):; $_=$1 =}
pega o nome do host. -j5
informa sem
para fazer um semáforo de contagem com 5 slots. --fg
força sem
a não gerar o trabalho em segundo plano. Usando o nome do host como ID, você receberá um semáforo de contagem para cada nome de host.
-q
é necessário para parallel
se alguns dos seus URLs contiverem caracteres de shell especiais (como &). Eles precisam ser protegidos da expansão de shell porque sem
também os expandirá.