Como pular o servidor sem resposta

3

Eu escrevi um script que é executado em vários servidores. Às vezes, o script fica preso em um dos servidores e eu tenho que bater (controle C) para finalizar o processo. Se não, fica preso e continua tentando se conectar.

Se / quando um servidor for interrompido ou não responder ao executar um script, existe uma maneira de ignorar esse host para que o script possa ir para o próximo host e continuar funcionando? Normalmente, quando eu clico no controle C, isso termina todo o processo.

Aqui está um exemplo do script. Vamos dizer que fica pendurado na máquina 3.

HOSTS=(MACHINE1 MACHINE2 MACHINE3 MACHINE4 MACHINE5)
for i in "${HOSTS[@]}"
do
  echo "$i"
  ssh -q "$i" uname -a
 done

Este script está sendo executado no OS X. Eu tentei usar o comando timeout , mas infelizmente ele não funciona.

    
por Sad Puppy 27.08.2015 / 19:40

2 respostas

2

Uma maneira comum de fazer isso é usar o comando trap para informar o script de shell para ignorar o SIGINT (gerado pelo Control-C) e, em seguida, para reativar o SIGINT em um subshell antes de seu comando ser executado.

trap "" INT
HOSTS=(MACHINE1 MACHINE2 MACHINE3 MACHINE4 MACHINE5)
for i in "${HOSTS[@]}"
do
    echo "$i"
    (trap - INT; ssh -q "$i" "uname -a")
done
    
por 27.08.2015 / 19:58
3

Em vez de criar o seu próprio e ter que lidar com tudo o que pode dar errado (host não responde, host parando de responder no meio, usuário pressionando Ctrl + C, relatório de erros,…), use um dos muitas ferramentas existentes para executar um comando em muitas máquinas por SSH .

mussh -t 4 -H <(printf '%s\n' "${HOSTS[@]}") -c 'uname -a'
pssh -t 4 -h <(printf '%s\n' "${HOSTS[@]}") uname -a
pdsh -u 4 -w "$(printf %s, "${HOSTS[@]}")" 'uname -a'
…
    
por 28.08.2015 / 02:27