GNU/Linux >> Tutoriels Linux >  >> Linux

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

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.


Linux
  1. Comment répéter une commande jusqu'à ce qu'elle réussisse sous Linux

  2. Comment installer et utiliser la commande Ping sous Linux

  3. Comment désactiver les réponses Ping sous Linux à l'aide de icmp_echo_ignore_all

  4. Comment boucler sur des répertoires sous Linux?

  5. Comment puis-je activer Ping sur une machine virtuelle Azure Linux

Comment installer et utiliser la commande Ping sous Linux

Comment envoyer un ping à un numéro de port sous Linux

Comment fonctionne le programme ping sous Linux

Commande ping Linux

Comment sauvegarder un hôte Linux distant à l'aide de l'utilitaire rsnapshot rsync

Comment désactiver la vérification de la clé d'hôte SSH sous Linux