AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 439810
Accepted
Killroy2018
Killroy2018
Asked: 2018-04-25 09:41:42 +0800 CST2018-04-25 09:41:42 +0800 CST 2018-04-25 09:41:42 +0800 CST

Como bash multithread?

  • 772
#!/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,

bash multithreading
  • 3 3 respostas
  • 10373 Views

3 respostas

  • Voted
  1. Ole Tange
    2018-04-25T12:36:15+08:002018-04-25T12:36:15+08:00

    Eu faria desta forma:

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

    O padrão será executar um trabalho por núcleo da CPU. Isso pode ser ajustado -j20para 20 trabalhos em paralelo.

    Ao contrário da xargssoluçã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:

    Agendamento simples

    Em vez disso, o GNU Parallel gera um novo processo quando um termina - mantendo as CPUs ativas e economizando tempo:

    Agendamento paralelo GNU

    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.

    $ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
       fetch -o - http://pi.dk/3 ) > install.sh
    $ sha1sum install.sh | grep 883c667e01eed62f975ad28b6d50e22a
    12345678 883c667e 01eed62f 975ad28b 6d50e22a
    $ md5sum install.sh | grep cc21b4c943fd03e93ae1ae49e28573c0
    cc21b4c9 43fd03e9 3ae1ae49 e28573c0
    $ sha512sum install.sh | grep da012ec113b49a54e705f86d51e784ebced224fdf
    79945d9d 250b42a4 2067bb00 99da012e c113b49a 54e705f8 6d51e784 ebced224
    fdff3f52 ca588d64 e75f6033 61bd543f d631f592 2f87ceb2 ab034149 6df84a35
    $ bash install.sh
    

    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

    • 5
  2. Best Answer
    Kusalananda
    2018-04-25T09:47:43+08:002018-04-25T09:47:43+08:00
    tr ',' ':' <test1.txt | xargs -P 4 -I XX ruby test.rb "http://XX/"
    

    Supondo que o test1.txtarquivo contenha linhas como

    127.0.0.1,80
    127.0.0.1,8080
    

    então o trmudaria isso para

    127.0.0.1:80
    127.0.0.1:8080
    

    e o xargstomaria uma linha de cada vez e substituiria XXa string de comando fornecida pelo conteúdo da linha e executaria o comando. Com -P 4isso, obtemos no máximo quatro processos simultâneos em execução.

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

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

    ou mesmo

    sed -e 's/,$//' -e 'y/,/:/' test1.txt | xargs ...as above...
    
    • 4
  3. William Pursell
    2018-04-25T09:54:41+08:002018-04-25T09:54:41+08:00

    gnu-parallele xargssã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:

    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 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 xargsjá parallelexiste, não há muito sentido.

    • 0

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve