Linux Ping: Afficher le temps mort

17

Comment puis-je faire le ping Linux pour afficher le délai d'attente des demandes au lieu d'omettre la sortie?

Tout comme la version Windows de ping.

André
la source
Comment ne pas afficher le timeout?
Michael

Réponses:

12

fping n'a pas fonctionné pour moi ... Dans mon cas, la plupart du temps je veux voir que c'est essentiellement pendant le redémarrage du serveur ... cela fonctionne plutôt bien sous Windows ...

Je construis un script simple (développant la réponse @entropo) pour m'aider à ce sujet, ce qui peut aider à répondre à cette question:

https://gist.github.com/brunobraga/7259197

#!/bin/bash

host=$1

if [ -z $host ]; then
    echo "Usage: `basename $0` [HOST]"
    exit 1
fi

while :; do
    result=`ping -W 1 -c 1 $host | grep 'bytes from '`
    if [ $? -gt 0 ]; then
        echo -e "`date +'%Y/%m/%d %H:%M:%S'` - host $host is \033[0;31mdown\033[0m"
    else
         echo -e "`date +'%Y/%m/%d %H:%M:%S'` - host $host is \033[0;32mok\033[0m -`echo $result | cut -d ':' -f 2`"
        sleep 1 # avoid ping rain
    fi
done

Et l'utilisation est quelque chose comme:

entrez la description de l'image ici

bruno.braga
la source
Pouvez-vous le modifier pour signaler le pourcentage de perte de paquets et compter sur chaque ligne?
Pol Hallen
21

La meilleure chose que j'ai trouvée a été d'utiliser l'indicateur -O (Notez que cela ne fonctionne pas sur toutes les distributions - en utilisant Linux Mint 17.1 Rebecca IPUTILS-PING 3: 20121221-4ubuntu1.1)

$ ping -O 10.10.5.1

64 bytes from 10.10.5.1: icmp_seq=53 ttl=245 time=460 ms
no answer yet for icmp_seq=54
64 bytes from 10.10.5.1: icmp_seq=55 ttl=245 time=265 ms
64 bytes from 10.10.5.1: icmp_seq=56 ttl=245 time=480 ms
no answer yet for icmp_seq=57
64 bytes from 10.10.5.1: icmp_seq=58 ttl=245 time=348 ms
64 bytes from 10.10.5.1: icmp_seq=59 ttl=245 time=515 ms
no answer yet for icmp_seq=60
64 bytes from 10.10.5.1: icmp_seq=61 ttl=245 time=320 ms
64 bytes from 10.10.5.1: icmp_seq=62 ttl=245 time=537 ms

Depuis la page de manuel:

-O Report outstanding ICMP ECHO reply before sending next packet. This is useful together with the timestamp -D to log output to a diagnostic file and search for missing answers.

scoy
la source
Salut scoy, bienvenue sur Super User et merci pour la réponse à cette question! Cela semble dépendre de la version de ping; sur Debian Wheezy, je reçois " ping: invalid option -- 'O'", mais sur Jessie, cela fonctionne comme vous le constatez. Vous pouvez mettre à jour votre réponse pour inclure ces informations. (J'ai également soumis une modification suggérée pour utiliser du texte préformaté pour la sortie et les informations de la page de
manuel
5

Lorsque j'utilise ping pour voir si un hôte est dans les scripts shell, je fais quelque chose comme ceci:

ping -W 1 -c 1 $HOST 2>&1 > /dev/null || (echo -n "dead!"; false) && command-that-needs-host-to-be-up

Fondamentalement, envoie un ICMP qui expire en une seconde sans sortie et utilise le code de sortie pour déclencher une action supplémentaire.

entropo
la source
2

Il n'y a aucun moyen pour le commun pingde faire ça. Si vous essayez de créer un script, vous avez quelques options:

ping -c 2 <ip>
RESULT=$?
echo $RESULT
1

Si le ping échoue, $?sera 1, si le ping réussit, $?sera 0.

L'autre option utilise fpingqui fonctionne beaucoup comme Cisco ping:

$ fping 200.1.1.1
200.1.1.1 is unreachable
$ fping 192.168.1.1
192.168.1.1 is alive

la source
2

Le script ci-dessus de bruno.braga fonctionne très bien, mais personnellement, je préfère utiliser un alias dans un profil de shell (comme .bashrc) afin que ce soit un cas d'utilisation quotidien.

Ma solution ci-dessous calcule également automatiquement le numéro de séquence de la demande ECHO:

alias pingt='__pingt() { s=0; while :; do s=$(($s+1)); result=$(ping $1 -c1 -W1 |/bin/grep from) && echo "$result, seq=$s" && sleep 1 || echo timeout; done }; __pingt $1'

Voici l'exemple de sortie lorsque l'hôte est instable avec un délai d'expiration:

$ pingt 10.10.10.126
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.235 ms, seq=1
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.228 ms, seq=2
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.209 ms, seq=3
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.241 ms, seq=4
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.195 ms, seq=5
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.211 ms, seq=6
timeout
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.267 ms, seq=8
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.232 ms, seq=9
^C

Bien sûr, l'inconvénient est: aucune statistique à la fin lorsque CTRL-C est pressé. Si vous le souhaitez, il serait également possible de calculer min / avg / max par script shell, mdev est bien au-delà de la portée.

Jackie Yeh
la source
1

J'ai peur, mais il n'y a pas de solution à 100% à cela avec le ping standard. Même avec ping -v pour une sortie détaillée, ping serait silencieux en cas de dépassement de délai. Vous pouvez essayer d'utiliser:

ping -w 2 192.168.199.1
PING 192.168.199.1 (192.168.199.1) 56(84) bytes of data.

--- 192.168.199.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1007ms

Cela arrêterait le ping après 2 secondes, puis afficherait le nombre de paquets transmis et la perte de paquets. Une autre option serait d'utiliser mtr .


la source
1
nomad@local:~$ fping -l -e 8.8.8.8

8.8.8.8 : [0], 92 bytes, 183 ms (183 avg, 0% loss)
8.8.8.8 : [1], 92 bytes, 61.4 ms (122 avg, 0% loss)
8.8.8.8 : [2], 92 bytes, 164 ms (136 avg, 0% loss)
8.8.8.8 : [3], 92 bytes, 163 ms (143 avg, 0% loss)
8.8.8.8 : [5], 92 bytes, 158 ms (146 avg, 16% loss)
8.8.8.8 : [6], 92 bytes, 122 ms (142 avg, 14% loss)
8.8.8.8 : [7], 92 bytes, 134 ms (141 avg, 12% loss)
8.8.8.8 : [8], 92 bytes, 130 ms (140 avg, 11% loss)

nomad@local:~$ fping -version
fping: Version 3.2
fping: comments to [email protected]
nvluan
la source
Notez cependant qu'après fping s'exécute pendant quelques minutes, les délais d'attente sporadiques n'ont aucun effet sur la perte imprimée (1 paquet sur 1000 représente une perte de 0,1% et fping continuera à imprimer 0%). Sans oublier qu'il est bien plus facile de remarquer un "délai d'expiration de la demande" que de rattraper le temps que 18% passe à 19% (sans oublier que vous devez ignorer le moment où 18% repasse à 17%)
ndemou
fpingest bon, et BTW -en'est pas nécessaire lorsque -lou -cest ajouté, pourrait simplement utiliser fping -l 8.8.8.8, la sortie est la même.
Eric Wang
0

J'aime beaucoup le script shell de Bruno. J'ai ajouté une ligne pour créer un fichier avec tous les échecs.

echo -e " date +'%Y/%m/%d %H:%M:%S'- l'hôte $ host est \ 033 [0; 31mdown \ 033 [0m" >> ./lostpackets.txt

Dave Honsvick
la source
0

Sans script quoi que ce soit

ping -f -i 1 hostname

Avantages : commande Linux standard - rien à installer ni à écrire.

Inconvénients :

  1. RIEN n'est imprimé pour les paquets qui reçoivent une réponse avec succès
  2. Il émet un bip ennuyeux pour les paquets qui reçoivent une réponse avec succès
  3. L'indication visuelle des délais d'attente est aussi minime que possible (un petit point reste à l'écran lorsqu'un paquet expire).

Avec un script minimal

#!/bin/bash
while :; do
    ping -W1 -c 1 "$@" | grep 'bytes from '
    case $? in
        0 ) sleep 1 ;;
        1 ) echo -e "request timeout" ;;
        * ) exit ;;
    esac
done

Inconvénients : vous n'obtenez aucune statistique à la fin et vous ne pouvez pas utiliser ces 3 options de ping:

  1. -i pour modifier l'intervalle entre l'envoi de paquets (il est codé en dur à 1 s)
  2. -W pour modifier le délai (il est codé en dur à 1 s)
  3. -c s'arrêter après l'envoi de N paquets

BTW: C'est l'un des exemples extrêmement rares de fonctionnalités que je manque vraiment d'un outil CLI Linux mais que je trouve dans un outil Windows. L'exception qui confirme la règle comme on dit :-)

ndemou
la source
0

Si vous souhaitez effectuer un ping continu tout comme Windows et avec horodatage, utilisez celui-ci. N'hésitez pas à remplacer 192.168.0.1par votre propre adresse IP

while :; do ping -c 1 -t 1 192.168.0.1 > /dev/null && echo "`date` >>> Reply OK" && sleep 1 || echo "`date` >>> Request timed out"; done

Exemple de réponse OK

[user@Linux ~]$ while :; do ping -c 1 -t 1 192.168.0.1 > /dev/null && echo "`date` >>> Reply OK" && sleep 1 || echo "`date` >>> Request timed out"; done
Wed Jan  3 03:41:49 GMT 2018 >>> Reply OK
Wed Jan  3 03:41:50 GMT 2018 >>> Reply OK
Wed Jan  3 03:41:51 GMT 2018 >>> Reply OK
^Z
[23]+  Stopped                 sleep 1
[user@Linux ~]$

Exemple de demande expirée

[user@Linux ~]$ while :; do ping -c 1 -t 1 192.168.0.254 > /dev/null && echo "`date` >>> Reply OK" && sleep 1 || echo "`date` >>> Request timed out"; done
Wed Jan  3 03:41:36 GMT 2018 >>> Request timed out
Wed Jan  3 03:41:37 GMT 2018 >>> Request timed out
Wed Jan  3 03:41:38 GMT 2018 >>> Request timed out
^Z
[22]+  Stopped                 ping -c 1 -t 1 192.168.0.254 >/dev/null
[user@Linux ~]$ 
Sabrina
la source
0

Le Ping normal vous montre en fait des délais d'attente. En regardant la valeur seq = entre les pings, vous pouvez dire combien de temps morts

64 bytes from 192.168.12.46: icmp_seq=8 ttl=62 time=46.7 ms
64 bytes from 192.168.12.46: icmp_seq=11 ttl=62 time=45.3 ms

EG 3 temps morts se sont produits entre les 2 pings ci-dessus depuis le premier seq=8et le second seq=11 (9 et 10 étaient des temps morts) seq=sequence.

Clive Gerada
la source