Réponses:
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:
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.
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
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.
Il n'y a aucun moyen pour le commun ping
de 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 fping
qui 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
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.
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 .
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 david@schweikert.ch
fping
est bon, et BTW -e
n'est pas nécessaire lorsque -l
ou -c
est ajouté, pourrait simplement utiliser fping -l 8.8.8.8
, la sortie est la même.
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
Sans script quoi que ce soit
ping -f -i 1 hostname
Avantages : commande Linux standard - rien à installer ni à écrire.
Inconvénients :
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:
-i
pour modifier l'intervalle entre l'envoi de paquets (il est codé en dur à 1 s)-W
pour modifier le délai (il est codé en dur à 1 s)-c
s'arrêter après l'envoi de N paquetsBTW: 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 :-)
Si vous souhaitez effectuer un ping continu tout comme Windows et avec horodatage, utilisez celui-ci. N'hésitez pas à remplacer 192.168.0.1
par 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 ~]$
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=8
et le second seq=11
(9 et 10 étaient des temps morts)
seq=sequence
.