Execute instâncias simultâneas de um comando dentro de um script Shell

Execute instâncias simultâneas de um comando dentro de um script Shell

Deixe-me começar dizendo que ainda estou aprendendo scripts bash e não estou ciente de muitas coisas. Se eu perder alguma coisa, fique à vontade para me repreender como quiser.

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

Então, a data esperou que ambos os pings terminassem. Isso significa que os pings foram executados sequencialmente.

Posso fazê-los rodar simultaneamente, gastando 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

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

PS: hosts.txt é onde eu armazeno os hosts que desejo fazer ping.

Responder1

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.

Porém, no seu caso, você precisa ter cuidado com uma condição de corrida. Você provavelmente desejaria enviar a saída dos comandos individuais para arquivos temporários e depois catá-los no arquivo principal, então provavelmente faria algo como:

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

Atualização: você pode tentar xargs (por exemplohttps://stackoverflow.com/questions/15755422/linux-bash-script-to-ping-multiple-hosts-simultaneously)

Responder2

Com o GNU Parallel você pode fazer isso:

date >> teste.txt
cat hosts.txt |  parallel -j0 ping -c 10 -i 1 {} >> teste.txt
date >> teste.txt

informação relacionada