Wymiana ping, która pokazuje w czasie rzeczywistym

9

Czy istnieje zastąpienie polecenia ping, które wyświetli datę / czas systemu oprócz czasu podróży w obie strony i numeru sekwencyjnego? Wolałbym narzędzie działające w systemie Linux, ale jeśli istnieje narzędzie cli, mogę uruchomić system Windows, to też byłoby dobre.

Istnieje system, który użytkownicy zgłaszają, co pewien czas wstrzymuje działanie . Wydaje się, że tak się nie dzieje. Nie byłem w stanie sprawić, aby użytkownik raportujący powiedział, kiedy to się stało, z wystarczającą dokładnością, aby móc skorelować pauzę z dowolnymi dziennikami.

Jeden z techników zostawił ping na dzień przeciwko gospodarzowi. Czas podróży w obie strony stał się dość duży w pewnym momencie. Próbuję dowiedzieć się, kiedy dokładnie to się stanie, aby zawęzić listę wpisów w dzienniku, na które powinienem patrzeć, i ewentualnie skorelować tę pauzę z innymi danymi, które mógłbym być w stanie zebrać z dzienników wydajności, dzienników urządzeń i tak dalej.

64 bytes from 10.2.4.241: icmp_seq=1825 ttl=64 time=0.321 ms
64 bytes from 10.2.4.241: icmp_seq=1826 ttl=64 time=0.371 ms
64 bytes from 10.2.4.241: icmp_seq=1827 ttl=64 time=13937.638 ms
64 bytes from 10.2.4.241: icmp_seq=1828 ttl=64 time=12937.526 ms
64 bytes from 10.2.4.241: icmp_seq=1829 ttl=64 time=11937.392 ms
64 bytes from 10.2.4.241: icmp_seq=1830 ttl=64 time=10937.275 ms
...
64 bytes from 10.2.4.241: icmp_seq=1840 ttl=64 time=936.073 ms
64 bytes from 10.2.4.241: icmp_seq=1841 ttl=64 time=0.410 ms
Zoredache
źródło

Odpowiedzi:

12

Możesz dodać znaczniki czasu, używając Perla:

ping 127.0.0.1 | perl -pe 'BEGIN {use POSIX;} print strftime("%Y-%m-%d %H:%M:%S ", localtime)'
Gleba
źródło
1
To prawie zbyt proste! :) Szukałem tego przez prawie 30 minut, ale niewiele dobrych wyników, dzięki!
l0c0b0x
12

Oto rozwiązanie bash :)

$ ping localhost | podczas odczytu linii; wykonaj echo -e "$ (data) \ t $ line"; gotowy
Wt 3 listopada 04:46:26 MSK 2009 PING localhost (127.0.0.1) 56 (84) bajtów danych.
Wt 3 listopada 04:46:26 MSK 2009 64 bajty z hosta lokalnego (127.0.0.1): icmp_seq = 1 ttl = 64 czas = 0,033 ms
Wt 3 listopada 04:46:27 MSK 2009 64 bajty z hosta lokalnego (127.0.0.1): icmp_seq = 2 ttl = 64 czas = 0,040 ms
Wt 3 listopada 04:46:28 MSK 2009 64 bajty z hosta lokalnego (127.0.0.1): icmp_seq = 3 ttl = 64 czas = 0,046 ms
Wt 3 listopada 04:46:29 MSK 2009 64 bajty z hosta lokalnego (127.0.0.1): icmp_seq = 4 ttl = 64 czas = 0,046 ms

Teraz sprawmy, aby datepolecenie wygenerowało nieco ładniejszy wynik:

$ ping localhost | podczas odczytu linii; wykonaj echo -e "$ (data +% H:% I:% S) \ t $ linia"; gotowy
04:04:13 PING localhost (127.0.0.1) 56 (84) bajtów danych.
04:04:13 64 bajty z hosta lokalnego (127.0.0.1): icmp_seq = 1 ttl = 64 czas = 0,044 ms
04:04:14 64 bajty z hosta lokalnego (127.0.0.1): icmp_seq = 2 ttl = 64 czas = 0,039 ms
04:04:15 64 bajty z hosta lokalnego (127.0.0.1): icmp_seq = 3 ttl = 64 czas = 0,042 ms

Twoje zdrowie!

kolypto
źródło
Pedantic: Nie powiedziałbym natywny, ponieważ polecenie daty jest poleceniem zewnętrznym i nie jest wbudowane w bash. Zwracam na to uwagę, ponieważ jeśli nie jesteś świadomy (możesz być, nie wiem), uświadomienie sobie, że istnieją wbudowane i niewbudowane polecenia jest ważne. Nadal dobre rozwiązanie :-)
Kyle Brandt
1
Nie potrzebuję też while [ 0 ]:ping google.com | while read line; do echo -e "$(date) $line"; done
Kyle Brandt
5

„Cięższą” opcją, której używamy do regularnego sprawdzania opóźnień i utraty pakietów, jest Smokeping . Nie tylko daje ci trochę więcej informacji w łatwiejszym do odczytania formacie, ale możesz także wykonywać takie czynności jak sprawdzanie HTTP i DNS zamiast polegać na ICMP. Wiele zapór i routerów nie nadaje priorytetu ICMP, co powoduje pomiary fałszywych opóźnień.

Palenie

Doug Luxem
źródło
Świetne narzędzie, choć cięższe niż skrypty, fajnie jest po prostu skonfigurować monitorowanie różnych systemów.
sclarson
2

W przypadku systemu Linux zainstaluj, moreutilsco da ci ts.

$ ping nu.nl | ts
jan 29 14:39:51 PING nu.nl (62.69.166.254) 56(84) bytes of data.
jan 29 14:39:51 64 bytes from 62-69-166-254.ptr.as24646.net (62.69.166.254): icmp_seq=1 ttl=247 time=29.8 ms
jan 29 14:39:52 64 bytes from 62-69-166-254.ptr.as24646.net (62.69.166.254): icmp_seq=2 ttl=247 time=29.4 ms
Willem
źródło
0

Użyjmy wbudowanej powłoki printfze %(datefmt)Tspecyfikacją formatu, aby uniknąć wywoływania cięższych interpreterów lub tworzenia nowego dateprocesu dla każdej linii.

ping -c4 localhost | while read line; do printf "%([%Y-%m-%dT%H:%M:%S])T %s\n" "-1" "$line"; done

Podobnie jak w przykładzie Perla, można to zrobić, wysyłając potoki do sed i awk. Myślę, że tsjest to najłatwiejsze, ale nie mamy tego na naszych serwerach. To samo dotyczy środowisk takich jak busybox.

Jeśli twoje polecenie buforuje dane wyjściowe, możesz użyć unbuffer.

Amit Naidu
źródło