#!/bin/bash
while IFS="," read ip port; do
ruby test.rb "http://$ip:$port/"&
ruby test.rb "https://$ip:$port/";
done <test1.txt
Como eu faria este multithreading? se eu fizer mais linhas divididas por & ele apenas executa o mesmo comando com o mesmo ip&port mais vezes, eu quero que ele execute com o próximo ip&port nem o mesmo, o arquivo se parece com 192.168.1.2,8089,
Eu faria desta forma:
O padrão será executar um trabalho por núcleo da CPU. Isso pode ser ajustado
-j20
para 20 trabalhos em paralelo.Ao contrário da
xargs
solução, você pode pós-processar a saída: A saída é serializada, portanto, você nunca verá a saída de duas tarefas misturadas.O GNU Parallel é um paralelizador geral e facilita a execução de trabalhos em paralelo na mesma máquina ou em várias máquinas às quais você tem acesso ssh.
Se você tiver 32 tarefas diferentes que deseja executar em 4 CPUs, uma maneira direta de paralelizar é executar 8 tarefas em cada CPU:
Em vez disso, o GNU Parallel gera um novo processo quando um termina - mantendo as CPUs ativas e economizando tempo:
Instalação
Por razões de segurança, é recomendado que você use seu gerenciador de pacotes para instalar. Mas se você não puder fazer isso, poderá usar esta instalação de 10 segundos.
A instalação de 10 segundos tentará fazer uma instalação completa; se isso falhar, uma instalação pessoal; se isso falhar, uma instalação mínima.
Para outras opções de instalação, consulte http://git.savannah.gnu.org/cgit/parallel.git/tree/README
Saber mais
Baixe a folha de dicas: http://www.gnu.org/s/parallel/parallel_cheat.pdf
Veja mais exemplos: http://www.gnu.org/software/parallel/man.html
Assista aos vídeos de introdução: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
Percorra o tutorial: http://www.gnu.org/software/parallel/parallel_tutorial.html
Inscreva-se na lista de e-mail para obter suporte: https://lists.gnu.org/mailman/listinfo/parallel
Supondo que o
test1.txt
arquivo contenha linhas comoentão o
tr
mudaria isso parae o
xargs
tomaria uma linha de cada vez e substituiriaXX
a string de comando fornecida pelo conteúdo da linha e executaria o comando. Com-P 4
isso, obtemos no máximo quatro processos simultâneos em execução.Se o seu arquivo tiver vírgulas em cada linha, remova-as primeiro:
ou mesmo
gnu-parallel
exargs
são opções muito melhores, mas para demonstrar como fazer isso com o loop while, existem duas opções principais que vejo:Faça tudo ao mesmo tempo:
Limite-se a 2 de cada vez:
O segundo é menos do que ideal, pois você terá um tempo morto entre a conclusão de um processo e a conclusão do segundo, e esse problema piora à medida que você adiciona mais processos. Você pode tentar consertar isso no shell, mas como
xargs
jáparallel
existe, não há muito sentido.