Odpowiedzi:
fping nie działało dla mnie ... W moim przypadku przez większość czasu chcę to zobaczyć w zasadzie podczas ponownego uruchamiania serwera ... działa to całkiem nieźle w systemie Windows ...
Buduję prosty skrypt (rozwijając odpowiedź @entropo), aby mi w tym pomóc, co może pomóc w udzieleniu odpowiedzi na to pytanie:
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
A użycie jest coś takiego:
Najlepszą rzeczą, jaką znalazłem, było użycie flagi -O (Uwaga: nie działa na wszystkich dystrybucjach - przy użyciu 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
Ze strony podręcznika:
-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
; na Debian Wheezy dostaję „ ping: invalid option -- 'O'
”, ale na Jessie działa jak zauważyłeś. Możesz zaktualizować swoją odpowiedź, aby uwzględnić te informacje. (
Kiedy używam polecenia ping, aby sprawdzić, czy host działa w skryptach powłoki, robię coś takiego:
ping -W 1 -c 1 $HOST 2>&1 > /dev/null || (echo -n "dead!"; false) && command-that-needs-host-to-be-up
Zasadniczo wysyła jeden ICMP, który przekracza limit czasu w ciągu sekundy bez danych wyjściowych, i używa kodu wyjścia do blokowania dalszych działań.
Zwykli nie ping
mogą tego zrobić. Jeśli próbujesz coś napisać, masz kilka opcji:
ping -c 2 <ip>
RESULT=$?
echo $RESULT
1
Jeśli ping się nie powiedzie, $?
będzie wynosił 1, jeśli ping się powiedzie, $?
będzie wynosił 0.
Inną opcją jest używanie, fping
które działa podobnie jak Cisco ping
:
$ fping 200.1.1.1
200.1.1.1 is unreachable
$ fping 192.168.1.1
192.168.1.1 is alive
Powyższy skrypt autorstwa bruno.braga działa dobrze, jednak osobiście wolę używać aliasu w profilu powłoki (np. .Bashrc), aby mógł to być codzienny przypadek użycia.
Moje rozwiązanie poniżej automatycznie oblicza również numer kolejny żądania 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'
Oto przykład wyjścia, gdy host jest niestabilny z przekroczonym limitem czasu:
$ 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
Oczywiście wadą jest brak statystyk na końcu po naciśnięciu CTRL-C. W razie potrzeby można również obliczyć min / avg / max za pomocą skryptu powłoki, mdev znacznie wykracza poza zakres.
Obawiam się, ale nie ma 100% rozwiązania tego problemu ze standardowym pingiem. Nawet przy ping -v dla pełnego wyjścia ping byłby cichy w przypadku przekroczenia limitu czasu. Możesz spróbować użyć:
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
To zatrzyma ping po 2 sekundach, a następnie pokaże liczbę przesłanych pakietów i utratę pakietów. Inną opcją byłoby użycie 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
jest dobra, a BTW -e
nie jest konieczne, gdy -l
lub -c
jest dodawany, można po prostu użyć fping -l 8.8.8.8
, wynik jest taki sam.
Naprawdę podoba mi się skrypt powłoki Bruno. Dodałem wiersz, aby utworzyć plik ze wszystkimi awariami.
echo -e " date +'%Y/%m/%d %H:%M:%S'
- host $ host to \ 033 [0; 31mdown \ 033 [0m" >> ./lostpackets.txt
Bez pisania skryptów
ping -f -i 1 hostname
Zalety : standardowe polecenie Linuksa - nic do zainstalowania lub skryptu.
Wady :
Z minimalnym skryptem
#!/bin/bash
while :; do
ping -W1 -c 1 "$@" | grep 'bytes from '
case $? in
0 ) sleep 1 ;;
1 ) echo -e "request timeout" ;;
* ) exit ;;
esac
done
Wady : na końcu nie otrzymujesz statystyk i nie możesz użyć tych 3 opcji ping:
-i
aby zmienić interwał między wysyłaniem pakietów (jest ustawiony na 1 sekundę)-W
zmienić limit czasu (jest ustawiony na 1 sekundę)-c
zatrzymać po wysłaniu N pakietówBTW: Jest to jeden z niezwykle rzadkich przykładów funkcjonalności, których tak naprawdę brakuje mi w narzędziu Linux CLI, ale znajduję się w narzędziu Windows. Wykonanie, które potwierdza regułę, jak mówią :-)
Jeśli chcesz wykonywać ciągłe pingowanie podobnie jak okna i ze znacznikiem czasu, użyj tego. Zastąp 192.168.0.1
go własnym adresem 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
Przykład Odpowiedz 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 ~]$
Przykład żądania upłynął limit czasu
[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 ~]$
Normalny ping rzeczywiście pokazuje limity czasu. Patrząc na wartość seq = między pingami, możesz stwierdzić, ile limitów czasu
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
Pomiędzy powyższymi 2 pingami wystąpiły limity czasu EG 3, ponieważ pierwszy był, seq=8
a drugi był seq=11
(9 i 10 były limitami czasu)
seq=sequence
.