Solution 1 :
Une autre simplification de la réponse de Martynas :
until ping -c1 www.google.com >/dev/null 2>&1; do :; done
notez que ping lui-même est utilisé comme test de boucle ; dès qu'il réussit, la boucle se termine. Le corps de la boucle est vide, avec la commande nulle ":
" utilisé pour éviter une erreur de syntaxe.
Mise à jour :j'ai pensé à un moyen de faire en sorte que Control-C quitte proprement la boucle de ping. Cela exécutera la boucle en arrière-plan, piégera le signal d'interruption (Control-C) et tuera la boucle d'arrière-plan si elle 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, cela devrait faire l'affaire.
Solution 2 :
Je sais que la question est ancienne... et demande spécifiquement concernant ping
, mais je voulais partager ma solution.
Je l'utilise lors du redémarrage des hôtes pour savoir quand je peux revenir en SSH. (Depuis ping
répondra pendant plusieurs secondes avant sshd
est lancé.)
until nc -vzw 2 $host 22; do sleep 2; done
Solution 3 :
Vous pouvez faire une boucle, envoyer un ping et selon le statut casser la boucle, par exemple (bash) :
while true; do ping -c1 www.google.com > /dev/null && break; done
Mettre ceci quelque part dans votre script bloquera, jusqu'à www.google.com
est pingable.
Solution 4 :
Ping une fois sur l'hôte cible. Vérifiez si le ping a réussi (la valeur de retour du ping est zéro). Si l'hôte n'est pas actif, ping à nouveau.
Le code suivant peut être enregistré sous forme de fichier et appelé avec le nom d'hôte comme argument, ou dépouillé de la première et de la dernière ligne et utilisé comme fonction dans un script existant (waitForHost nom d'hôte).
Le code n'évalue pas la cause de l'échec si le ping n'aboutit pas à une réponse, bouclant ainsi indéfiniment 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, donc je suppose que cela pourrait ne pas être portable, c'est pourquoi je l'ai laissé de côté.
#!/bin/bash
PING=`which ping`
function waitForHost
{
if [ -n "$1" ];
then
waitForHost1 $1;
else
echo "waitForHost: Hostname argument expected"
fi
}
function waitForHost1
{
reachable=0;
while [ $reachable -eq 0 ];
do
$PING -q -c 1 $1
if [ "$?" -eq 0 ];
then
reachable=1
fi
done
sleep 5
}
waitForHost $1
Solution 5 :
UNREACHEABLE=1;
while [ $UNREACHEABLE -ne "0" ];
do ping -q -c 1 HOST &> /dev/null; UNREACHEABLE=$?; sleep 1;
done
Vous pouvez supprimer le sommeil 1, c'est uniquement ici pour éviter tout problème d'inondation dans le cas où l'hôte serait joignable mais le ping ne se terminerait pas avec le code 0.