Quero escrever a lógica no shell script, que tentará executar novamente após 15 segundos, até 5 vezes, com base no "status code = FAIL", se falhar devido a algum problema.
shell-script
Sandeep Singh
fonte
fonte
break
se sucessos de comando, em seguida, ele vai quebrar o loopif command; then break; fi
ou mais sucintamente apenascommand && break
n
falhas, ele desnecessariamente dorme mais uma vez antes de sair.Substitua "comando" por seu comando. Isso pressupõe que "código de status = FAIL" significa qualquer código de retorno diferente de zero.
Variações:
Usando a
{..}
sintaxe. Funciona na maioria dos shells, mas não no BusyBoxsh
:Usando
seq
e passando o código de saída do comando com falha:O mesmo que acima, mas pulando
sleep 15
após a falha final. Como é melhor definir apenas o número máximo de loops uma vez, isso é conseguido adormecendo no início do loop sei > 1
:fonte
for i in 1 2 3 4 5
porfor i in {1..5}
porque é mais fácil de manter.&&
é avaliada antes da||
causa da precedência do operadorcommand
falhar.[[ i -eq 5]]
como condição OR antes do sono para evitar isso.Exemplo:
produz esta saída:
Para um exemplo de trabalho do mundo real com comandos complexos, consulte este script .
fonte
Aqui está a função para tentar novamente
Resultado :
fonte
bash retry.sh 3 ping -c1 localhost
O GNU Parallel possui
--retries
:fonte
Aqui está o meu alias / script favorito de uma linha
Então você pode fazer coisas como:
e continuará executando o comando anterior até encontrar o "Próximo processo"
fonte
fc -e "#"
vez defc -s
.Eu uso esse script que faz novas tentativas de um determinado comando, o benefício desse script é que, se todas as tentativas falharem, preservará o código de saída.
Provavelmente pode ficar mais simples
fonte
Veja abaixo o exemplo:
Estou tentando conectar a porta 3389 no host local, ele tentará novamente até 5 vezes, se for bem-sucedido, ele quebrará o loop.
$?
existe o status de comando se zero significa que o comando é executado com sucesso, se diferente de zero significa comando faiParece um pouco complicado, pode ser que alguém faça isso melhor do que isso.
fonte
$?
é existir status do comando se zero significa comando executar com êxito, se diferente de zero significa comando falharVocê pode usar o
loop
comando, disponível aqui , da seguinte forma:O que fará o seu trabalho a cada 15 segundos até que seja bem-sucedido, por no máximo cinco vezes.
fonte
Aqui está uma
retry
função recursiva para puristas de programação funcional:Passe um comando (ou um nome de função) e, opcionalmente, várias tentativas e uma duração de sono entre tentativas, da seguinte forma:
fonte