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

1voto

Luke Exton Points 115

Pour bien gérer le SIGINT sur le ping de BSD.

HOST=google.com NO=1; while [ $NO -ne 0 ]; do ping -W1 -c1 $HOST &>/dev/null; NO=$?;echo "$(date) ($HOST) $NO" ; done; echo "$(date) ($HOST) reachable"

en fonction

ping_until(){
  local NO=1
  while [ $NO -ne 0 ]; do
    ping -W1 -c1 $1 &>/dev/null; NO=$?
    # Optionally block ICMP flooding
    # sleep 1
    echo "$(date) ($1) ($NO)"
  done
}

1voto

saulius2 Points 256

Les amis, oui c'est vieux. Beaucoup de bonnes réponses ici.

Mais Je viens de trouver ce que j'appelle une beauté ! Au cas où quelqu'un aimerait le natif ping compteur :

ping $HOST | sed "/ ms$/ q"

N'est-ce pas fascinant ? :)

[p@localhost ~]$ VBoxManage startvm VGTU-2021-LDVM1 --type headless && \
> ping 192.168.10.14 | sed "/ ms$/ q"
Waiting for VM "VGTU-2021-LDVM1" to power on...
VM "VGTU-2021-LDVM1" has been successfully started.
PING 192.168.10.14 (192.168.10.14) 56(84) bytes of data.
From 192.168.10.8 icmp_seq=1 Destination Host Unreachable
From 192.168.10.8 icmp_seq=2 Destination Host Unreachable
  ...
From 192.168.10.8 icmp_seq=35 Destination Host Unreachable
From 192.168.10.8 icmp_seq=36 Destination Host Unreachable
64 bytes from 192.168.10.14: icmp_seq=37 ttl=64 time=2003 ms

0voto

Guillaume Points 451

J'ai utilisé la fonction suivante. Je l'aime parce que je peux lui dire d'arrêter d'essayer après un certain temps :

#!/usr/bin/env bash

function networkup {
  # Initialize number of attempts
  reachable=$1
  while [ $reachable -ne 0 ]; do
    # Ping supplied host
    ping -q -c 1 -W 1 "$2" > /dev/null 2>&1
    # Check return code
    if [ $? -eq 0 ]; then
      # Success, we can exit with the right return code
      echo 0
      return
    fi
    # Network down, decrement counter and try again
    let reachable-=1
    # Sleep for one second
    sleep 1
  done
  # Network down, number of attempts exhausted, quiting
  echo 1
}

On peut l'utiliser comme ça pour lancer quelque chose :

# Start-up a web browser, if network is up
if [ $(networkup 60 www.google.com) -eq 0 ]; then
  firefox &
fi

0voto

Divide Points 306

Un complément à la réponse de Gordon Davisson :

until $(ping -c1 www.google.com &>/dev/null); do :; done

avec le "$()" qui l'entoure, une sous-séquence est lancée et vous pouvez donc utiliser Control-C pour terminer la boucle au cas où l'hôte ne serait pas disponible.

0voto

mungayree Points 101
$ cat bin/check_host_up.sh
HOST=$1
PINGCMD="ping -c1 $HOST >/dev/null 2>&1"
while true; do
    eval $PINGCMD && sleep 1 && echo -n . ||    \
    (                                           \
        echo && echo "(${HOST}) down:" $(date) &&         \
            until eval $PINGCMD; do :; done &&  \
        echo "(${HOST}) up  :" $(date)
    );
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