Execute o comando em vários servidores em paralelo usando o shell script [duplicate]

1

Eu tenho milhares de máquinas remotas. Eu quero executar alguns comandos específicos em todos eles, mas em paralelo. Eu uso esses comandos que são executados sequencialmente:

for f in 'cat host.lst'
do
       ./runScript.sh $f
done

Suponhamos que host.lst contenha 100 hosts. Desejo executar runScript.sh em 100 hosts em paralelo. Além disso, os registros devem ser mantidos.

Não consigo instalar nenhum utilitário na minha máquina, como PSSH .

Eu fiz muita pesquisa e encontrei esses links, mas eles não ajudaram. Eu não entendo como eles funcionam:

Executa automaticamente comandos via SSH em muitos servidores

Execute o comando em vários arquivos correspondentes a um padrão em paralelo

Alguém pode explicar a lógica?

    
por api1411 11.04.2017 / 23:20

2 respostas

6
logdir='mktemp -d'
bunch=200

IFS=$'\n'
for hosts in $(< hosts.lst xargs -r -L "$bunch"); do
   IFS=" ";
   for host in $hosts; do
      ssh -n -o BatchMode=yes "$host" './runScript.sh' 1>"$logdir/$host.log" 2>&1 &
   done
   wait
done

Supondo que os 100s de hosts estejam listados como uma / linha no arquivo hosts.lst e, em seguida, um grupo seja selecionado em uma vez (200), e em cada um desses 200 hosts geraram runScript.sh using ssh em batch mode e, ao mesmo tempo, preservando o stdout+stderr de cada um desses trabalhos em segundo plano em um arquivo com o nome host no diretório $logdir , que pode ser examinado como e quando necessário. / p>

Finalmente, esperamos que um grupo termine antes de lançar o próximo grupo, por meio do comando wait no final do loop for interno.

    
por 12.04.2017 / 07:47
2

A modificação a seguir no seu script, que não requer nenhum outro utilitário, será executada em paralelo, mas pode ficar limitada, dependendo das limitações de identificadores de arquivos abertos dos seus hosts:

for f in $(cat host.lst); do
       ./runScript.sh $f &
done

Para capturar os resultados em um log, basta adicionar > run.log após done para salvar em um novo arquivo, run.log .

A alteração da chave é a adição de & , que executa um processo em segundo plano em vez de aguardar a conclusão antes de executar o próximo comando.

    
por 11.04.2017 / 23:33