Je veux écrire la logique dans un script shell qui le réessayera de s'exécuter de 15 à 5 secondes en fonction du "code d'état = FAIL" s'il échoue à cause d'un problème.
shell-script
Sandeep Singh
la source
la source
break
si la commande réussit, la boucle sera rompueif command; then break; fi
ou plus succinctement justecommand && break
n
échec, il dort inutilement une fois de plus avant de sortir.Remplacez "commande" par votre commande. Cela suppose que "code d'état = FAIL" désigne tout code de retour différent de zéro.
Variations
Utiliser la
{..}
syntaxe. Fonctionne dans la plupart des shells, mais pas dans BusyBoxsh
:Utilisation
seq
et transmission du code de sortie de la commande ayant échoué:Comme ci-dessus, mais en sautant
sleep 15
après l'échec final. Dans la mesure où il est préférable de définir le nombre maximal de boucles une seule fois, vous pouvez vous mettre en veille au début de la boucle sii > 1
:la source
for i in 1 2 3 4 5
parfor i in {1..5}
parce que c'est plus facile à maintenir.&&
est évalué avant le en||
raison de la prioritécommand
échoue.[[ i -eq 5]]
comme condition d’opération avant le sommeil pour éviter cela.Exemple:
produit cette sortie:
Pour un exemple concret, avec des commandes complexes, voir ce script .
la source
Voici la fonction pour réessayer
Sortie:
la source
bash retry.sh 3 ping -c1 localhost
GNU Parallel a
--retries
:la source
Voici mon alias / script préféré d'une ligne
Ensuite, vous pouvez faire des choses comme:
et il continuera à exécuter la commande précédente jusqu'à ce qu'il trouve "Prochain processus"
la source
fc -e "#"
place defc -s
.J'utilise ce script qui effectue les tentatives d'une commande donnée. L'avantage de ce script est que si toutes les tentatives échouent, le code de sortie est préservé.
Probablement cela peut devenir plus simple
la source
Voir ci-dessous Exemple:
J'essaye de connecter le port 3389 sur localhost, il essaiera jusqu'à 5 fois d'échouer, en cas de succès, il cassera la boucle.
$?
il existe un statut de commande si zéro signifie une commande exécutée avec succès, si autre que zéro signifie une commande faiCela semble un peu compliqué, peut-être que quelqu'un le fera mieux que cela.
la source
$?
il existe un statut de commande si zéro signifie une commande exécutée avec succès, si autre que zéro signifie une commande échouéeVous pouvez utiliser la
loop
commande, disponible ici , comme suit:Ce qui fera votre chose toutes les 15 secondes jusqu'à ce qu'il réussisse, pour un maximum de cinq fois.
la source
Voici une
retry
fonction récursive pour les puristes de la programmation fonctionnelle:Transmettez-lui une commande (ou un nom de fonction) et éventuellement un nombre de tentatives et une durée de veille entre les tentatives, comme suit:
la source