Executa instâncias concorrentes de um comando dentro de um script de shell

1

Deixe-me começar dizendo que ainda estou aprendendo scripts bash e não tenho conhecimento de muitas coisas. Se eu sentir falta de algo, sinta-se à vontade para me repreender como quiser.

Continuamente, estou criando um script bash simples para executar um ping em dois hosts diferentes e gerar um arquivo. Eu já compreendi isso e está funcionando. Por curiosidade, eu adicionei no script a data de saída antes e depois da impressão do resultado do ping, então eu sei quanto tempo demorou para executar o ping. Eu configurei o ping para um intervalo de 1 segundo, 10 pings, 2 hosts. Meu primeiro encontro (foi há muito tempo atrás ...) tinha 14:36:20 como hora. A segunda data (após o ping) tinha 14:36:40 como hora.

Assim, a data esperou que os dois pings terminassem. Isso significa que os pings foram executados sequencialmente.

Posso fazê-los rodar simultaneamente, então passo 10 segundos executando o script em vez de 20 segundos?

Aí vem o trecho do meu script:

date >> teste.txt
cat hosts.txt |  while read output
do   ping -c 10 -i 1 "$output" >> teste.txt
done
date >> teste.txt

Existem várias outras coisas que eu quero que este script faça, mas prometo que só perguntarei se não conseguir encontrar uma resposta satisfatória em Barsa.

PS: hosts.txt é onde eu armazeno os hosts que eu quero pingar.

    
por Rafael Umbelino 20.05.2016 / 19:46

1 resposta

2

O texto da sua pergunta é um pouco difícil de entender, mas acho que você está procurando algo como:

command & 
command &
wait

O script executará os dois comandos em segundo plano e aguardará a resposta.

No entanto, no seu caso, você precisa ter cuidado com uma condição de corrida. Você provavelmente iria querer enviar a saída dos comandos individuais para arquivos temporários e, em seguida, colocá-los no arquivo principal, então você provavelmente faria algo como:

command > "${tmp1}" & 
command > "${tmp2}" & 
wait
cat "${tmp1}" "${tmp2}" >> "${main}"
rm -f "${tmp1}" "${tmp2}"

Atualização: Você pode experimentar xargs (por exemplo, link )

    
por 20.05.2016 / 19:55