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...

4voto

Francois Wolmarans Points 1560

Veuillez consulter les bonnes options à stackoverflow . Voici un exemple en bash, vous devrez boucler sur le code suivant jusqu'à ce qu'il retourne un résultat ping réussi.

ping -c 1 -t 1 192.168.1.1;
if [ $? -eq 0 ]; then
    echo "192.168.1.1 is up";
else 
    echo "ip is down";
fi

3voto

cas Points 6563

Toutes les boucles ci-dessus peuvent également être utilisées avec fping plutôt que ping qui, IMO, est mieux adapté pour une utilisation dans scripts que ping lui-même. Voir fping(1) pour les détails.

while ! fping -q $HOSTNAMES ; do :; done

également utile pour tester si les machines sont en état de marche avant de faire quelque chose dessus. Un exemple simple :

for h in HOST1 HOST2 HOST3 ; do
  if fping -q $h ; then
     echo -n "$h : "
     ssh $h "uname -a"
  fi
done

3voto

Melebius Points 139

Pour les utilisateurs de macOS, ping a l'option -o spécifiquement pour cela :

-o      Exit successfully after receiving one reply packet.

La commande est donc simple :

ping -o www.google.com

Il retourne 0 lorsque l'hôte a été pingué avec succès une fois.

1voto

jason saldo Points 5036

Cela permettra d'essayer un nombre donné de fois.

t=4; c=0; r=0; until ping -c 1 hostname.com >/dev/null 2>&1 || ((++c >= t)); do r=$?; done; echo $r

Au lieu de faire écho $r vous pouvez le tester et agir en fonction de sa valeur :

if ((r)); then echo 'Failed to contact host'; else echo 'Continuing with script'; fi

1voto

Christopher Points 1

En général, je veux attendre que ma base de données ou un autre serveur s'active, mais je ne veux pas attendre trop long. Le code suivant attend 10 secondes, puis définit le code de sortie si le serveur n'est pas apparu 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 morceau de code puisse être exécuté.

for i in `seq 1 10`; do date ; sleep 1 ; ping -c1 ${HOST} &>/dev/null && break ; done

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