Une simplification supplémentaire de la réponse de Martynas:
until ping -c1 www.google.com >/dev/null 2>&1; do :; done
notez que le ping lui-même est utilisé comme test de boucle; dès qu'elle réussit, la boucle se termine. Le corps de la boucle est vide, avec la commande null " :
" utilisée pour empêcher une erreur de syntaxe.
Mise à jour: j'ai pensé à un moyen de forcer Control-C à quitter la boucle de ping proprement. Cela exécutera la boucle en arrière-plan, interceptera le signal d'interruption (Control-C) et supprimera la boucle d'arrière-plan s'il se produit:
ping_cancelled=false # Keep track of whether the loop was cancelled, or succeeded
until ping -c1 "$1" >/dev/null 2>&1; do :; done & # The "&" backgrounds it
trap "kill $!; ping_cancelled=true" SIGINT
wait $! # Wait for the loop to exit, one way or another
trap - SIGINT # Remove the trap, now we're done with it
echo "Done pinging, cancelled=$ping_cancelled"
C'est un peu détourné, mais si vous voulez que la boucle soit annulable, elle devrait faire l'affaire.
Gordon Davisson
la source
ping
, attendra 10 secondes avant d'abandonner son ping. Si vous voulez réduire cela à 1 seconde, vous pouvez utiliser-w1
.-W1
kill %1
pour le tuer.Vous pouvez faire une boucle, envoyer un ping et en fonction de l’état, casser la boucle, par exemple (bash):
Mettre ceci quelque part dans votre script bloquera, jusqu'à ce que
www.google.com
soit pingable.la source
while true
etbreak
est la solution plus propre, IMO.while true; do sleep 5; ping ...
Je sais que la question est ancienne ... et demande spécifiquement en ce qui concerne
ping
, mais je voulais partager ma solution.J'utilise cette information lors du redémarrage des hôtes pour savoir quand je pourrai SSH y revenir. (Depuis
ping
répondra pendant plusieurs secondes avant desshd
commencer.)la source
Cinglez l'hôte cible une fois. Vérifiez si le ping a réussi (la valeur renvoyée par ping est zéro). Si l'hôte n'est pas en vie, cinglez à nouveau.
Le code suivant peut être enregistré en tant que fichier et appelé avec le nom d'hôte en tant qu'argument, ou supprimé de la première et de la dernière ligne et utilisé en tant que fonction dans un script existant (nom d'hôte waitForHost).
Le code n'évalue pas la cause de l'échec si le ping ne donne pas de réponse, bouclant ainsi à tout jamais si l'hôte n'existe pas. Ma page de manuel BSD répertorie la signification de chaque valeur de retour, contrairement à celle de Linux. Je suppose donc que cela n’est peut-être pas portable, c’est pourquoi je l’ai omis.
la source
Vous pouvez supprimer le sommeil 1, c’est ici seulement pour éviter tout problème d’inondation au cas où l’hôte serait accessible mais que le ping ne se termine pas avec le code 0.
la source
S'il vous plaît voir de bonnes options à stackoverflow . Voici un exemple dans bash, vous devrez parcourir le code suivant jusqu’à ce qu’il retourne un résultat ping réussi.
la source
N'importe laquelle des boucles ci-dessus peut également être utilisée avec fping plutôt qu'avec ping, qui, IMO, convient mieux à une utilisation dans des scripts que le ping lui-même. Voir fping (1) pour plus de détails.
également utile pour tester si les machines sont en marche avant de faire quelque chose dessus. Un exemple simple:
la source
Cela va essayer un nombre de fois donné.
Au lieu de faire écho
$r
, vous pouvez le tester et agir en fonction de sa valeur:la source
Pour gérer correctement le ping SIGINT sur BSD.
en tant que fonction
la source
J'ai utilisé la fonction suivante. J'aime ça parce que je peux lui dire d'arrêter d'essayer après un moment:
Il peut être utilisé comme ceci pour lancer quelque chose:
la source
En général, je veux attendre que ma base de données ou un autre serveur apparaisse, mais je ne veux pas attendre trop longtemps. Le code suivant attend 10 secondes, puis définit le code de sortie si le serveur n'apparaît pas dans le délai imparti.
Si le serveur apparaît avant la limite de temps, la boucle sera court-circuitée afin que le prochain bit de code puisse être exécuté.
la source
Une autre amélioration à la réponse de Gordon Davisson:
avec le '$ ()' environnant, un sous-shell est démarré et vous pouvez donc utiliser Control-C pour terminer la boucle si l'hôte n'est pas disponible.
la source