Como bash multithread?

1
#!/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 isso multithreading? se eu fizer mais linhas divididas por & ele só executa o mesmo comando com o mesmo ip & port mais vezes, eu quero que ele seja executado com o próximo ip & porta nem o mesmo o arquivo parece 192.168.1.2,8089,

    
por Killroy2018 24.04.2018 / 19:41

3 respostas

2
tr ',' ':' <test1.txt | xargs -P 4 -I XX ruby test.rb "http://XX/"

Supondo que o arquivo test1.txt contenha linhas como

127.0.0.1,80
127.0.0.1,8080

então o tr mudaria isso para

127.0.0.1:80
127.0.0.1:8080

e o xargs pegaria uma linha de cada vez e substituiria XX na cadeia de comandos dada pelo conteúdo da linha e executaria o comando. Com -P 4 , obtemos no máximo quatro processos simultâneos em execução.

Se o seu arquivo tiver vírgulas à direita em cada linha, remova-as primeiro:

sed 's/,$//' test1.txt | tr ',' ':' | xargs ...as above...

ou até mesmo

sed -e 's/,$//' -e 'y/,/:/' test1.txt | xargs ...as above...
    
por 24.04.2018 / 19:47
0

gnu-parallel e xargs são opções muito melhores, mas, para demonstrar como fazer isso com o loop while, há duas opções principais que vejo:

Faça tudo ao mesmo tempo:

while IFS="," read  ip port; do
    ruby test.rb "http://$ip:$port/" <&- &
done <test1.txt

Limite-se a 2 de cada vez:

while IFS="," read  ip port; do
    ruby test.rb "http://$ip:$port/" <&- &
    IFS=, read ip port || break
    ruby test.rb "http://$ip:$port/" <&- &
    wait
done <test1.txt

O segundo é menos que ideal, já que você terá um tempo morto entre a conclusão de um processo e a conclusão do segundo, e esse problema piorará à medida que você adicionar mais processos. Você pode tentar corrigir isso no shell, mas como xargs e parallel já existem, não há muito sentido.

    
por 24.04.2018 / 19:54
-1

Eu faria assim:

parallel --colsep , ruby test.rb {3}://{1}:{2}/ :::: ipport.txt ::: http https

O padrão será executar um trabalho por núcleo de CPU. Isso pode ser ajustado com -j20 para 20 trabalhos em paralelo.

Ao contrário do xargs -solution, você pode processar a saída: A saída é serializada, então você nunca verá a saída do mix de duas tarefas.

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 para as quais você tem acesso ssh.

Se você tem 32 tarefas diferentes que você quer rodar em 4 CPUs, uma forma direta de paralelizar é rodar 8 tarefas em cada processador:

O

GNUParallelgeraumnovoprocessoquandoumtermina-mantendoasCPUsativaseeconomizandotempo:

Instalação

Por razões de segurança, você deve instalar o GNU Parallel com seu gerenciador de pacotes, mas se o GNU Parallel não estiver empacotado para sua distribuição, você pode fazer uma instalação pessoal, que não requer acesso root. Isso pode ser feito em 10 segundos ao fazer isso:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

Para outras opções de instalação, consulte o link

Saiba mais

Veja mais exemplos: link

Assista aos vídeos de introdução: link

Percorra o tutorial: link

Inscreva-se na lista de e-mail para obter suporte: link

    
por 24.04.2018 / 22:36