Dans ce bref guide, nous allons apprendre à répéter une commande jusqu'à ce qu'elle réussisse sous Linux. Cela peut être utile dans de nombreuses occasions. Par exemple, vous pouvez utiliser cette méthode pour vérifier la connectivité réseau entre deux ou plusieurs hôtes ou vérifier la connectivité Internet pour voir si vous êtes toujours en ligne ou hors ligne. Donc, quelle que soit la raison, si vous avez toujours voulu répéter une commande ou un programme Linux jusqu'à ce qu'il se termine avec succès, ce guide vous aidera.
Répétez la commande jusqu'à ce qu'elle réussisse sous Linux
Pour l'exécution répétitive d'une liste de commandes, nous utilisons les constructions de boucle BASH suivantes :
- Boucle While,
- Jusqu'à la boucle.
Boucle While exécute le bloc de code (inclus dans do ... done ) lorsque la condition est vraie et continue à l'exécuter jusqu'à ce que la condition devienne fausse . Une fois que la condition devient fausse , la boucle while est terminée.
Jusqu'à la boucle est juste à l'opposé de la boucle While. Il exécute le bloc de code (inclus dans do ... done ) lorsque la condition est fausse et continuez à l'exécuter jusqu'à ce que la condition devienne vraie . Une fois que la condition devient vraie , la boucle until est terminée.
Voyons d'abord comment répéter une commande Linux ou un programme jusqu'à ce qu'il réussisse en utilisant la boucle While.
1. Répétez une commande jusqu'à ce qu'elle réussisse en utilisant la boucle While
Jetez un oeil à la commande suivante :
$ while ! ping -c 3 ostechnix.com ; do sleep 2 ; done ; xcalc
Cette commande continuera d'essayer d'envoyer un ping au site ostechnix.com. Une fois le site en ligne, la boucle While se terminera et affichera le "xcalc" programme. Ici, xcalc est facultatif. C'est juste à des fins de notification. Sinon, nous devrons peut-être continuer à vérifier la fenêtre du terminal pour vérifier si la commande a réussi ou non.
Explication :
Décomposons la commande ci-dessus et voyons ce que fait chaque instruction.
while ! ping -c 3 ostechnix.com ;
Ceci est l'instruction conditionnelle. Comme vous le voyez dans cette déclaration, nous avons précédé la commande ping de ! personnage. Il sert de "PAS" état. Donc, la signification réelle de la ligne ci-dessus est - tandis que PAS en mesure d'envoyer un ping ostechnix.com .
do sleep 2 ; done ;
L'instruction "do sleep 2" , indique qu'il ne faut pas marteler le système en essayant à plusieurs reprises la commande ping chaque seconde. Nous demandons au système d'attendre un peu, par exemple 2 secondes, puis d'essayer d'envoyer un ping à ostechnix.com. En d'autres termes, la commande While continuera à envoyer un ping au site toutes les 2 secondes. Une fois que la condition devient fausse, la boucle while se terminera.
xcalc ;
Exécutez le programme xcalc. Ce programme ne s'exécutera qu'après l'exécution réussie de la commande précédente.
Donc, selon la commande ci-dessus, si la condition est vraie (c'est-à-dire si ostechnix.com n'est "PAS" accessible), il exécutera le bloc de code inclus dans do...done . Ici, le code est "dormir 2". Il attend donc 2 secondes puis réessaye de pinger le site. Il continuera à l'exécuter jusqu'à ce que la condition devienne fausse. Une fois que la condition devient fausse (c'est-à-dire si ostechnix.com est accessible), la boucle se terminera et finalement le programme xcalc s'ouvrira.
Voici l'exemple de sortie de la commande ci-dessus :
ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known PING ostechnix.com (104.26.5.40) 56(84) bytes of data. 64 bytes from 104.26.5.40 (104.26.5.40): icmp_seq=1 ttl=55 time=63.6 ms 64 bytes from 104.26.5.40 (104.26.5.40): icmp_seq=2 ttl=55 time=84.8 ms 64 bytes from 104.26.5.40 (104.26.5.40): icmp_seq=3 ttl=55 time=79.9 ms --- ostechnix.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2001ms rtt min/avg/max/mdev = 63.602/76.114/84.810/9.068 ms Warning: Cannot convert string "-adobe-symbol-*-*-*-*-*-120-*-*-*-*-*-*" to type FontStruct
2. Répétez une commande jusqu'à ce qu'elle réussisse en utilisant la boucle Jusqu'à
Vous pouvez également le faire en utilisant la boucle "Jusqu'à" comme ci-dessous.
$ until ping -c 3 ostechnix.com ; do sleep 2 ; done ; xcalc
Décomposons cette commande et voyons ce que fait chaque instruction :
until ping -c 3 ostechnix.com ;
Ceci est l'instruction conditionnelle. Cela signifie - ping jusqu'à ce que le site soit accessible.
do sleep 2 ; done ;
Essayez d'envoyer un ping au site toutes les 2 secondes jusqu'à ce qu'il soit accessible. Une fois que la condition devient vraie, c'est-à-dire que le site est accessible, la boucle sera terminée.
xcalc
Exécutez le programme xcalc. Il ne s'exécutera qu'après l'exécution réussie des commandes précédentes.
Ainsi, conformément à la commande ci-dessus, la boucle Until continuera à envoyer un ping à ostechnix.com jusqu'à ce qu'elle réussisse. Une fois le site accessible, la boucle jusqu'à se terminera et le programme xcalc s'ouvrira.
Lire connexe :
- Comment exécuter une commande Linux toutes les X secondes pour toujours
3. Répétez la commande précédente jusqu'à ce qu'elle réussisse
Nous savons maintenant comment exécuter une commande Linux jusqu'à ce qu'elle se termine avec succès. Qu'en est-il de la commande précédente ? Comment répéter ou réessayer les commandes précédentes jusqu'à ce qu'elles réussissent ? C'est facile aussi !
Nous avons déjà posté différentes manières de répéter la dernière commande. Si vous ne savez pas comment faire, consultez le guide suivant.
- Différentes façons de répéter votre dernière commande sous Linux
Comme indiqué dans le lien ci-dessus, pour exécuter toute dernière commande exécutée, tapez simplement double point d'exclamation , et appuyez sur ENTER comme ci-dessous :
$ !!
Cela exécutera la dernière commande.
Donc, si vous voulez répéter les commandes précédentes jusqu'à ce qu'elles réussissent en utilisant la boucle While, exécutez :
$ !!; while [ $? -ne 0 ]; do !!; done
Pour répéter les commandes précédentes jusqu'à ce qu'elles réussissent à l'aide de la boucle Until, exécutez :
$ until !!; do :; done
Pour plus d'exemples sur la boucle Bash While et la boucle Until, reportez-vous au guide suivant :
- Scripts bash :boucle While et Until expliquée à l'aide d'exemples