Jak ustawić krótki limit czasu za pomocą polecenia ping?

49

Próbuję napisać skrypt, który wyświetla listę wszystkich hostów w mojej sieci LAN (jest ich około 20) i zapisuje status pingowania obok każdego hosta. Mam plik dzierżawy DHCP, więc mam wszystkie adresy IP (powiedzmy 10.0.0.1, 10.0.0.2 itd.), Wszystko czego potrzebuję to status ping dla każdego hosta.

Tak więc mój skrypt uruchamia pojedynczy ping dla każdego hosta:

ping -c 1 10.0.0.1

Niestety, gdy host jest w trybie offline, ping zajmuje dużo czasu. Sprawdziłem man ping, wydaje się, że istnieją dwie opcje ustawiania czasu oczekiwania: -w deadlinei -W timeout. Myślę, że interesuje mnie to drugie.

Więc próbowałem tego:

ping -c 1 -W 1 10.0.0.1

Ale oczekiwanie jednej sekundy na host offline jest wciąż zbyt długie. Próbowałem ustawić go na mniej niż sekundę, ale wydaje się, że w ogóle nie uwzględnia parametru:

ping -c 1 -W 0.1 10.0.0.1  # timeout option is ignored, apparently

Czy istnieje sposób na ustawienie limitu czasu na niższą wartość? Jeśli nie, czy są jakieś alternatywy?

Edytować

  • System operacyjny to Debian Lenny.
  • Hosty, które próbuję pingować, są w rzeczywistości punktami dostępu. Są w tej samej sieci Vlan i podsieci co użytkownicy (dla uproszczenia wdrażania i wymiany). Dlatego nie chcę skanować całej podsieci ( ping -bna przykład za pomocą ).

Edytuj # 2

Zaakceptowałem fpingrozwiązanie (dziękuję za wszystkie pozostałe odpowiedzi). To polecenie robi dokładnie to, czego szukałem:

fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4

Wykonanie tego polecenia zajmuje najwyżej 500 ms i daje mi status ping wszystkich hostów jednocześnie:

10.0.0.1 : [0], 84 bytes, 5.71 ms (5.71 avg, 0% loss)
10.0.0.2 : [0], 84 bytes, 7.95 ms (7.95 avg, 0% loss)
10.0.0.3 : [0], 84 bytes, 16.1 ms (16.1 avg, 0% loss)
10.0.0.4 : [0], 84 bytes, 48.0 ms (48.0 avg, 0% loss)

10.0.0.1 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 5.71/5.71/5.71
10.0.0.2 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 7.95/7.95/7.95
10.0.0.3 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 16.1/16.1/16.1
10.0.0.4 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 48.0/48.0/48.0

W systemie Debian Lenny instalacja jest prosta:

aptitude update
aptitude install fping
MiniQuark
źródło

Odpowiedzi:

41

fping może być lepszym narzędziem niż zwykły ping, którego używasz. Na jakim systemie operacyjnym jesteś?

  • „fping różni się od pingowania tym, że możesz podać dowolną liczbę celów w wierszu poleceń lub określić plik zawierający listy celów do pingowania”.
  • „Zamiast wysyłać do jednego celu, dopóki nie przekroczy limitu czasu lub nie odpowie, fping wyśle ​​pakiet ping i przejdzie do następnego celu w sposób okrężny.”
  • „W przeciwieństwie do pingowania, fping jest przeznaczony do użycia w skryptach, więc jego wyniki są zaprojektowane tak, aby można je było łatwo przeanalizować.”
AndyN
źródło
1
Działa świetnie, dzięki, tego właśnie szukałem. Ta komenda dobrze sobie radzi: fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 ... Cała sprawa trwa pół sekundy i otrzymuję wyniki dla wszystkich hostów jednocześnie. Doskonałe narzędzie. :-))
MiniQuark,
37

Dla osób szukających rozwiązania, które wymaga ping, użyj -iprzełącznika.

ping -i 0.2 www.google.com

Lub, jeśli chcesz użyć 0.1, musisz uruchomić go jako root

sudo ping -i 0.1 www.google.com

Nie ma potrzeby pobierania dodatkowych narzędzi.

Victor Bjelkholm
źródło
4
+1 ode mnie Jest to pierwszy wynik, kiedy „limit czasu pingowania” w Google jest dokładnie tym, czego szukałem.
Steven Jeffries
@StevenJeffries Same tutaj!
Luc
1
W przypadku martwego hosta to rozwiązanie wydrukuje swoje pierwsze przydatne wyjście po około 1 sekundzie. To zdecydowanie zła odpowiedź, jak już wspomniano @MarcelBurkhard.
Victor Yarema,
1
Problem z tym rozwiązaniem polega na tym, że -i 0.1 NIE będzie czekać 100 ms, ale dłużej, na pingi, które zajmują więcej niż 100 ms, co powoduje wyłączenie timera.
Llamageddon,
2
Ta odpowiedź jest niepoprawna - nie zmienia, jak długo pingbędzie czekać na odpowiedź - raczej po prostu wysyła kolejne pingi szybciej ...
Mtl Dev
21

Możesz ustawić krótki limit czasu za pomocą timeoutpolecenia na Ubuntu / Debian:

timeout 0.2 ping -c1 fqdn || { do_work }
Jordon Bedwell
źródło
Dobra odpowiedź! Teraz zrobiłem: limit czasu 1 ping -c 1 test.com
vrijdenker
1
Moja wersja limitu czasu akceptuje tylko 1 sekundę. timeout (GNU coreutils) 8.4.
slm
podoba mi się to rozwiązanie, można je zastosować do wszystkich innych poleceń
datdinhquoc
@slm, dziwne jest, że twoja wersja nie obsługuje mniej niż sekundę. Działa dla mnie: DURATION is a floating point number with an optional suffix: 's' for seconds (the default),... W moich man timeoutraportach przypadków GNU coreutils 8.26. BWT, używam Ubuntu 17.04.
Victor Yarema,
Jest to właściwie jedyna rzecz, która działa, jeśli chcesz zmniejszyć limity czasu (host nie odpowiada) ... Musisz jednak wykonać matematykę: limit czasu musi być większy niż „-c” * „-i” polecenia ping-
Marki
13

Używałbym nmap do tego zadania.

nmap -sP --max-retries=1 --host-timeout=1500ms 10.0.0.1

Więcej informacji na ten temat można znaleźć w dokumentacji nmap .

pacey
źródło
Dobry telefon .. To jest „Niesamowity” sposób na zrobienie tego: D +1
Arenstar
Cześć, właśnie próbowałem tego, ale otrzymałem następujący komunikat o błędzie: „- limit czasu hosta jest określony w milisekundach, chyba że kwalifikujesz go przez dodanie„ s ”,„ m ”,„ h ”lub„ d ”. Wartość musi być większa niż 1500 milisekund ”.
MiniQuark,
Myślę, że problem jest oczywisty, limit czasu nie może być krótszy niż 1500 ms. Myślę, że powinieneś poszukać opcji nmap dotyczących równoległości.
pacey
To wydaje się wysyłać tylko jedno żądanie. Szukam ciągłego wykrywania błędów, dostałem się tutaj przez Google „przekroczenie limitu czasu ping”, Czy nmap oferuje takie pingi jak ubuntu ping?
ThorSummoner
ustawienie limitu czasu na wartość krótszą niż sekunda będzie wymagało użycia uprzywilejowanego użytkownika, jak w odpowiedzi @ victor-bjelkholm
thrau
4

możesz przyjrzeć się narzędziu ping arp, jeśli wszystkie hosty znajdują się w fizycznej sieci LAN. Robi to samo, ale używa pakietów arp warstwy 2 do wykonania polecenia „ping”. Możesz użyć kombinacji arpping i icmp ping, lub w rzeczywistości tcp ping, aby ustalić, jaka jest awaria. Przykładem jest awaria stosu tcp, chociaż obecnie zdarza się rzadko, możemy stwierdzić, czy awaria stosu tcp komputera uległa awarii, ponieważ maszyna nie zareagowałaby na ping, ale zareagowałaby na arp (który jest innym kawałkiem kodu na hoście) .

za pomocą kombinacji arpping, tcpping i icmp ping możesz dowiedzieć się, czy usługa na komputerze uległa awarii, stos tcp się zawiesił lub maszyna została całkowicie zamknięta. Jeśli zarządzałeś przełącznikami ethernetowymi, możesz uzyskać dane łącza fizycznego, ujawniając, czy maszyna jest faktycznie włączona, czy fizycznie odłączona. Mieliśmy sytuację, w której maszyny (klienci w pokojach publicznych) byłyby wyłączone, zebraliśmy te dane i wysłaliśmy budzenie na pakietach LAN, aby zasilić maszyny. :-)

Bez względu na to, jakie rozwiązania budujesz, jeśli Twoja sieć jest zajęta, pomyśl o wdrożeniu pewnego rodzaju qos, aby pakiety monitorujące miały priorytet w sieci, a utrata pakietów pomiarowych z powodu przeciążenia sieci może dawać fałszywe alarmy. Jeśli używasz qos do monitorowania pakietów, musisz pomyśleć o gromadzeniu danych o wykorzystaniu sieci.

Możesz więc uczynić swoje rozwiązanie monitorujące tak złożonym lub tak łatwym, jak tylko chcesz. Uważamy, że nawet najbardziej elementarny system monitorowania jest krokiem we właściwym kierunku, przynajmniej niektórzy administratorzy pilnują maszyn :-).

powodzenia!

The Unix Janitor
źródło
3

@ jordon-bedwell ma świetną sugestię.

@ laszlo-valko https://stackoverflow.com/questions/20359487/why-does-ping-not-timeout-in-linux wyjaśnia, że ​​limity czasu ping rozpoczynają się dopiero po ustaleniu adresu IP. Jeśli używasz dns, a twoja stacja robocza jest w trybie offline, ping nie może ustalić adresu ip, więc wydaje się, że czeka około domyślnych 20 + sekund przed zwróceniem false.

Korzystanie z linuksowego narzędzia „limit czasu” zapewnia większą kontrolę podczas uruchamiania polecenia ping z nazwą domeny.

Dzięki chłopaki

Digc
źródło
2

Użyj przełącznika -w , zarówno w systemie Windows, jak i Debianie.

Jest to szybki sposób sprawdzenia, czy maszyna w ogóle reaguje, zakładając, że zareaguje w czasie krótszym niż określona liczba sekund.

ping -w 1 192.168.80.105

PING 192.168.80.105 (192.168.80.105) 56(84) bytes of data.

--- 192.168.80.105 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 999ms
NXT
źródło
1

Jeśli możesz przeskanować swoją podsieć (lub jej część) bez wywoływania alarmów bezpieczeństwa i nie przeszkadza ci trochę dodatkowych danych, Angry IP Scanner jest szybki, bezpłatny, umożliwia kliknięcie w celu sortowania według stanu i może dostarczyć bardziej szczegółowych informacji .

Paweł
źródło
0

Dlaczego nie uruchomić ping w tle, z wyjściem do pliku tymczasowego, równolegle dla każdego hosta? Następnie przespaj jedną sekundę, zabij wszystkie procesy ping, które są nadal uruchomione, i przeczytaj pliki, aby zebrać dane wyjściowe.

dfranke
źródło
1
Myślę, że to zadziała, ale szukałem prostszego rozwiązania. W każdym razie dzięki.
MiniQuark,
Ta metoda nie jest skalowana.
Synetech,
0

Limit czasu jest liczbą całkowitą wskazującą, jak daleko i jak długo pakiet może zostać wysłany. Wartości poniżej 1 są bez znaczenia. Wartość 1 wskazuje, że pingujesz tylko bezpośrednich sąsiadów.

Jedynym sposobem na przyspieszenie jest sprawdzenie tła i zebranie wyników. To właśnie robią narzędzia takie jak Nagios.

BillThor
źródło
1
Przepraszam, ale tak naprawdę nie sądzę, że to prawda. Strona podręcznika jest dość jasna, że ​​-W określa „Czas oczekiwania na odpowiedź w sekundach”; nie jest bezwymiarowy i chociaż ping nie honoruje wartości poniżej 1 (stąd pytanie) limity poniżej sekundy nie są bez znaczenia. Jeśli mi wybaczysz, możesz pomylić -W z -t, przy czym to drugie ustawia pole IP TTL (liczba przeskoków), które działa tak, jak opisano, a wartości poniżej 1 są naprawdę bez znaczenia.
MadHatter,
-W to czas, w którym proces ping czeka na odpowiedź, i może mieć sens ustawienie go znacznie poniżej liczby przeskoków, gdy liczba przeskoków jest wysoka, co zwykle jest. W ciągu trzech sekund zwykle dochodzi do ponownych prób. Niektóre narzędzia mogą zezwalać na użycie drobniejszego licznika czasu oczekiwania, ale dla większości zastosowań pingowania sekundy są rozsądną jednostką.
BillThor,
0

Możesz spróbować czegoś takiego. Ale uruchomienie zajmuje 15 minut.

a=258
while [ $a -ge 1 ]
do
    echo "10.0.0.$a"
    sudo ping -i 0.1 -c 1 "10.0.0.$a">>/home/$USER/output.log
   a=`expr $a - 1`
done
cat /home/$USER/output.log|grep -i "icmp_req=1"
cat /dev/null>/home/$USER/output.log
VeggieVampire
źródło
Wygląda na to, nmapże byłoby właściwym narzędziem do pracy.
kasperd
0

Spróbuj tego:

ping -n 5 1.2.3.4.5 >nul
Micky
źródło
Jak to jest lepsze niż fping?
pisklęta
-1

ping ma opcje [-t limit czasu] i [-W czas oczekiwania], dzięki czemu możesz:

ping -c 1 -t 1 -W 1 google.com
Ivelin
źródło