bash script: repita o comando se ele retornar um erro

21

Eu gostaria de criar um loop que repita uma transferência ncftp se ele retornar um erro.

Estou um pouco inseguro sobre como a variável de código de saída pode ser usada em um loop. Algo assim funcionaria?

until [$? == 0]; do
    ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file
done
    
por Roy 03.11.2009 / 10:05

4 respostas

33

Eu encontrei a base para este elegante loop em outro lugar no serverfault. Acontece que não há necessidade de salvar o código de saída, como você pode testar diretamente no comando em si;

until ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file; do
  echo Tansfer disrupted, retrying in 10 seconds...
  sleep 10
done
    
por 03.11.2009 / 12:15
8

Quase. Provavelmente, é melhor salvar o valor de retorno como uma variável, para que você possa configurá-lo antes do loop. Caso contrário, será afetado pelo comando de última execução.

Você também pode querer colocar um sleep nele para impedi-lo de renascer muito rápido.

RET=1
until [ ${RET} -eq 0 ]; do
    ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file
    RET=$?
    sleep 10
done
    
por 03.11.2009 / 10:10
2

Bit hacky, mas a minha solução foi apenas criar uma função bash que roda sozinha se sair com uma falha

function retry { the_command_you_want && echo "success" || (echo "fail" && retry) }; retry
    
por 17.03.2017 / 04:55
0

Você pode fazer um loop enquanto o seu comando retorna erro:

    while [ -n $(ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file) ]; do
            sleep 1;
    done;
    
por 09.12.2016 / 22:01

Tags