Executando comandos após o símbolo de e comercial & em uma sessão ssh remota

1

Eu tenho um script de shell que inicia um longo comando de uso intensivo de recursos em várias máquinas diferentes.

Para executar o script em cada máquina em paralelo, tenho um símbolo E comercial após cada comando remoto no loop for.

initialize-cluster.sh :

while read host; 
do
    ssh -f "$host" \"/home/user/allocate.sh\" &
done < ~/cluster

No entanto, como consequência, não obtenho o prompt do shell de volta no final do loop. Isso me impede de executar outros scripts depois que initialize-cluster.sh terminar de executar allocate.sh em todas as máquinas.

Por exemplo, quero poder executar um comando como:

./initalize-cluster.sh && ./execute-something-else.sh

No entanto, atualmente initialize-cluster nunca "termina".

Gostaria que os comandos subseqüentes executassem somente depois que todos os scripts allocate.sh terminassem nas máquinas remotas.

    
por eitan27 17.10.2014 / 18:47

1 resposta

2

Nada neste script deve impedir a execução do próximo comando ou retornar ao prompt do shell. O que poderia estar dando a impressão de que o prompt se foi é a saída dos scripts remotos, que chegariam após o retorno ao shell. Para evitar que você possa redirecionar o stdout / stderr para algum arquivo de log.

Como os comandos remotos são executados em segundo plano, o script original será concluído antes que os scripts allocate tenham terminado a execução: o próximo comando não pode presumir que a inicialização foi concluída. Para iniciar todas as inicializações em paralelo e esperar que todas terminem, você pode fazer o seguinte:

#!/bin/sh
while read host 
do
  ssh "$host" "/home/user/allocate.sh" &
done < ~/cluster
wait

E então deve ser possível:

./initialize-cluster.sh && ./execute-something-else.sh

A chave aqui é o comando wait , que aguarda a conclusão dos processos filhos.

    
por 17.10.2014 / 19:34