Linux Ping: Pokaż limit czasu

17

Jak ustawić ping w Linuksie, aby wyświetlał żądanie przekroczenia limitu czasu zamiast pomijać dane wyjściowe?

Podobnie jak wersja ping systemu Windows.

Andre
źródło
Jak nie wyświetlasz limitu czasu?
Michael

Odpowiedzi:

12

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:

wprowadź opis zdjęcia tutaj

bruno.braga
źródło
Czy możesz go zmodyfikować, aby zgłosić procent utraty pakietów i liczyć na każdą linię?
Pol Hallen,
21

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.

scoy
źródło
Cześć scoy, witamy w Super User i dziękuję za odpowiedź na to pytanie! Wydaje się, że jest to zależne od wersji 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. (
Przesłałem
5

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

entropo
źródło
2

Zwykli nie pingmogą 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, fpingktó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

źródło
2

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.

Jackie Yeh
źródło
1

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 .


źródło
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
źródło
Należy jednak pamiętać, że po kilku minutach wykonywania fping sporadyczne przekroczenia czasu mają zerowy wpływ na utratę wydruku (1 pakiet na 1000 to utrata 0,1%, a fping nadal drukuje 0%). Nie wspominając o tym, że o wiele łatwiej jest zauważyć „przekroczenie limitu czasu żądania” niż złapanie czasu, w którym 18% zmienia się w 19% (nie wspominając, że musisz zignorować moment, w którym 18% wraca do 17%)
ndemou
fpingjest dobra, a BTW -enie jest konieczne, gdy -llub -cjest dodawany, można po prostu użyć fping -l 8.8.8.8, wynik jest taki sam.
Eric Wang,
0

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

Dave Honsvick
źródło
0

Bez pisania skryptów

ping -f -i 1 hostname

Zalety : standardowe polecenie Linuksa - nic do zainstalowania lub skryptu.

Wady :

  1. NIC nie jest drukowane dla pakietów, które pomyślnie odpowiedziały
  2. Wydaje denerwujący sygnał dźwiękowy dla pakietów, które pomyślnie odpowiedziały
  3. Wizualne wskazanie limitów czasu jest tak minimalne, jak to tylko możliwe (mała kropka pozostaje na ekranie, gdy limit czasu zostanie przekroczony).

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:

  1. -i aby zmienić interwał między wysyłaniem pakietów (jest ustawiony na 1 sekundę)
  2. -W zmienić limit czasu (jest ustawiony na 1 sekundę)
  3. -c zatrzymać po wysłaniu N pakietów

BTW: 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ą :-)

ndemou
źródło
0

Jeśli chcesz wykonywać ciągłe pingowanie podobnie jak okna i ze znacznikiem czasu, użyj tego. Zastąp 192.168.0.1go 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 ~]$ 
Sabrina
źródło
0

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=8a drugi był seq=11 (9 i 10 były limitami czasu) seq=sequence.

Clive Gerada
źródło