Eu tenho um servidor de controle remoto que eu uso para executar automaticamente comandos/scripts etc para todos os meus nós em série. Para aumentar o desempenho e a velocidade, eu queria executá-lo em paralelo. Estou executando comandos aproximadamente em 180 nós. Em série demoro cerca de 2 horas para terminar de executar em todos eles. Então eu estou procurando velocidade no momento. O código pseodue se parece com o seguinte, usei based64 para enviar o comando para outros nós. Eu posso executar qualquer comando arbitrariamente complexo usando-o.
for host in ${sshconfig[@]}; do
ssh "$host" "echo $COMMAND | base64 -d | bash" &
done
Mas cometi um erro ao esquecer que havia muitos nós, então meu script bash criou muitos processos para cada nó, como resultado, o sistema do servidor de controle travou e foi desligado. Agora não consigo mais me conectar a ele.
Eu gostaria de saber, como posso alocar memória em um script bash? A facilidade do ssh
bash tornou o bash realmente ideal para a minha situação, mas eu queria saber como posso melhorar o desempenho executando-os em paralelo e ainda não me preocupar com a falha do sistema etc.
Para limitar o número de conexões SSH paralelas, você pode usar
xargs
assim:Isso executaria seu comando em no máximo quatro instâncias paralelas (dadas por
-P 4
). A-I {}
opção fariaxargs
substituir a{}
string no comando por uma string lida de sua entrada padrão. A entrada padrão é conectada àprintf
qual simplesmente imprime um item dasshconfig
lista de cada vez.Você testaria isso com várias
-P
configurações até encontrar um número que parecesse funcionar bem.Se o seu shell de login nas máquinas remotas for
bash
, você também pode considerar