67 votes

Comment faire un ping sous linux jusqu'à ce que l'hôte soit connu ?

Comment puis-je envoyer une requête ping à une certaine adresse et, lorsqu'elle est trouvée, arrêter de l'envoyer.

Je veux l'utiliser dans un script bash, ainsi lorsque l'hôte démarre, le script continue à faire du ping et à partir du moment où l'hôte est disponible, le script continue...

109voto

nullDev Points 1778

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 la boucle ; dès qu'il réussit, la boucle se termine. Le corps de la boucle est vide, avec la commande null " : " utilisé pour éviter une erreur de syntaxe.

Mise à jour : J'ai trouvé un moyen de faire en sorte que Control-C quitte la boucle ping proprement. Ceci va exécuter la boucle en arrière-plan, capturer le signal d'interruption (Control-C), et tuer la boucle en 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 compliqué, mais si vous voulez que la boucle soit annulable, cela devrait faire l'affaire.

43voto

Aaron Copley Points 12225

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 à nouveau y accéder par SSH. (Depuis ping répondra pendant plusieurs secondes avant que sshd est lancé).

until nc -vzw 2 $host 22; do sleep 2; done

30voto

bk1e Points 13737

Vous pouvez faire une boucle, envoyer un ping et, en fonction du statut, interrompre la boucle, par exemple (bash) :

while true; do ping -c1 www.google.com > /dev/null && break; done

Placer ceci quelque part dans votre script bloquera, jusqu'à ce que www.google.com est pingable.

11voto

Baxissimo Points 1822

Effectuez un ping de l'hôte cible une fois. Vérifiez si le ping a réussi (la valeur de retour de ping est zéro). Si l'hôte n'est pas vivant, envoyez un nouveau ping.

Le code suivant peut être sauvegardé dans un 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 hostname).

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 liste la signification de chaque valeur de retour, alors que celle de Linux ne le fait pas, donc je suppose que ce n'est pas 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

9voto

radius Points 9485
UNREACHEABLE=1;
while [ $UNREACHEABLE -ne "0" ]; 
   do ping -q -c 1 HOST &> /dev/null; UNREACHEABLE=$?; sleep 1;
done

Vous pouvez supprimer sleep 1, il n'est là que pour éviter tout problème de flooding dans le cas où l'hôte serait atteignable mais où le ping ne sortirait pas avec le code 0.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X