Szybszy sposób niż ping do sprawdzenia, czy komputer jest online?


20

Piszę skrypt wake on lan dla zestawu naszych komputerów laboratoryjnych. Mamy bazę danych sqlite z listą nazw hostów komputerów, adresów IP i MAC, a obecnie pinguję każdą z nich za pomocą „-c1”, aby nie działała bez końca - ale nawet to zajmuje trochę czasu, czy jest szybszy sposób na uzyskanie odpowiedzieć zamiast pingować? Używanie polecenia ping wydaje się spowalniać skrypt, ponieważ wymaga on odpowiedzi ping, aby kontynuować.

Wielkie dzięki za wszelkie sugestie!

Odpowiedzi:


20

Wysłanie pojedynczego pakietu i oczekiwanie na odpowiedź będzie jednym z najszybszych możliwych sposobów, a ping jest dobrym sposobem na zrobienie tego. W rzeczywistości, w zależności od przypadku użycia, twierdzę, że jest zbyt szybki , ponieważ tak naprawdę nie mówi ci, czy system faktycznie robi coś pożytecznego, tylko że podsystem sieciowy jądra jest żywy i skonfigurowany.

Ale zakładając, że to wystarczy, możesz wprowadzić pewne ulepszenia. Po pierwsze, możesz użyć, -W1aby skrócić limit czasu pingowania do jednej sekundy. Po drugie, możesz zmusić skrypt do asynchronicznego pingowania różnych hostów (w wątku w tle) i sprawdzania wyników w razie potrzeby zamiast czekania.

Alternatywnie możesz ponownie przemyśleć to podejście i sprawić, by zdalne systemy w jakiś sposób dokonały odprawy, gdy są włączone, a jeśli system się nie zalogował, możesz założyć, że nie działa.


Dobre połączenie z dodatkiem -w musiało być dwa, ponieważ kilka komputerów nie reagowało wystarczająco szybko. Może zastanowię się nad dodaniem jakiegoś okresowego odprawy lub uścisku dłoni, ale na razie chcę, aby proces był stosunkowo zewnętrzny w stosunku do komputerów, które włączam.
Jon Phenow

1
Używam także -s, aby wysłać mniejszy pakiet.
Shawn J. Goff

3
Będę zszokowany, jeśli wysłanie mniejszego pakietu robi różnicę.
mattdm

Czy nie są już prawie wysyłane przy prawie minimalnym rozmiarze pakietów?
Jon Phenow

4
Są dość małe; domyślnie jest 56 bajtów danych, które można zmniejszyć. Ale w każdym razie jest mniejszy niż Ethernet MTU i większy niż nic, więc sprowadza się do „jednego pakietu” w obu przypadkach.
mattdm

7

Do tego właśnie został zaprojektowany Fping. http://fping.sourceforge.net/

Następnie musisz przeanalizować dane wyjściowe zamiast polegać na kodzie zwrotnym, ale jest to o wiele szybsze niż normalne pingowanie.


Myślę, że to trochę zabawne, w opisie jest napisane: „W przeciwieństwie do pingowania, fping jest przeznaczony do użycia w skryptach, a jego wyniki łatwo analizować”. a jednak nie zapewnia kodu powrotu
Adam Plocher

Jakie byłyby dobre wartości dla kodu powrotu?
Thorbjørn Ravn Andersen

3

Działa to tylko dla jednego lub dwóch komputerów, ale jeśli podłączysz je bezpośrednio do komputera odpowiedzialnego za sprawdzenie ich statusu, możesz ethtoolsprawdzić, czy łącze jest aktywne, czy nie.


Nie użyłem do tego ettoolu, czy chciałbyś podać przykład? (a może link)?
Johan

ethtool {network_interface} | grep "Link detected" | cut -f 3 -d ' 'wróci, yesjeśli urządzenie jest podłączone, a nojeśli nie jest.
LawrenceC

2

Co możesz zrobić, ping pingować adres rozgłoszeniowy, co powinno spowodować, że wszystkie komputery odpisują. Następnie możesz porównać tę listę z tym, co masz w SQLite, aby upewnić się, że wszystkie komputery działają.

Poza tym ping jest prawdopodobnie najszybszym sposobem na upewnienie się, że komputer nie śpi w sieci. Jak wspomniano w drugiej odpowiedzi, nie zapewnia to żadnych naprawdę przydatnych danych. Jeśli masz możliwość instalowania skryptów, możesz dodać cronjob do pingowania serwera centralnego, uruchomić zadanie lub po prostu wysłać listę procesów do serwera centralnego, który zarejestruje żądanie. Następnie po prostu sprawdź, co powie ci, jeśli masz jakieś problemy bez konieczności ręcznego sprawdzania za każdym razem.


1
Zakładam, że masz na myśli polecenie ping adresu rozgłoszeniowego, a nie bramy. W nowoczesnych systemach prawdopodobnie to nie zadziała. Zobacz unix.stackexchange.com/questions/7458/cant-ping-broadcast
mattdm

1
@mattdm: Zatem Multicast ? Nie wiedziałem, że większość ludzi to wyłączyła. Nigdy wcześniej nie miałem z tym problemów.
Josh K

Haha tak, dziękuję mattdm, podobny problem, na jaki natrafiłem. nie chodzi o to, że ludzie je wyłączają, ale generalnie przychodzą ostatnio z wyłączonym programem.
Jon Phenow

Przy pomocy fping ( fping.sourceforge.net ) można równolegle pingować listę hostów. Nie musisz polegać na tym, że możesz pingować adres rozgłoszeniowy.
mazianni

2

Ganglia używa ruchu multiemisji do monitorowania wielu hostów w klastrze, być może mógłbyś użyć czegoś podobnego? Zakłada się, że sprzęt sieciowy zezwala na ruch multiemisji między wszystkimi hostami a systemem monitorowania.


1
Wygląda na fajne narzędzie, ale na potrzeby tego małego skryptu może dodać niepotrzebną część do projektu, na razie zachowując go jako dość mały skrypt. Na pewno jednak będę miał na to oko, wygląda jak narzędzie, którego wkrótce mogę użyć.
Jon Phenow

0

Miałem ten sam problem i wpadłem na następujący (szybki i brudny) skrypt. To zasadniczo wysyła wszystkie pingi jako osobne zadania równolegle i skanuje całą podsieć / 24 w 3 sekundy; zwróć uwagę, że z jakiegoś powodu nie zadałem sobie trudu, aby dowiedzieć się, że nie mogę tutaj użyć kodu wyniku ping, ale grep -v wykonał zadanie:

#!/bin/bash
case $# in
1)
  case $1 in
  [1-9]*)
        echo
        echo Systems active in subnet: $1
        for (( K = 1 ; K < 255 ; K=$K+1 )); do
        # grep -v delivers 0 on no matches
                echo -ne "testing:" $1$K "...    \r"
                (if ping -c 1 -w 1 -n $1$K 2>&1 | grep -q '64 bytes' ; then
                echo $1$K alive "                "
                fi) &
        done
        sleep 3
        echo "                               "
        exit 0
        ;;
  esac;;
esac

0

W C

/* count = 1, wait interval = 1 second, no name lookup, */
/* 10 data bytes, 1 second timeout, 200 millisecond wait time */

sprintf(command,"ping -c1 -i1 -n -s10 -t1 -W200 %u" 
   , connection[port].IPAddress);
err = system(command);
/* err == 0 means OK */

0

Odkryłem, że fping -r0 ...zapewniają najszybszą odpowiedź.

Opcja -r(ponów) wydaje się szybsza niż podobna -c(liczba). Użycie -r0wyników powoduje wysłanie tylko jednego polecenia ping, a wynik jest znacznie skrócony w porównaniu do innych opcji.

W moim systemie ...

fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01  2>&1

Prowadzi do...

LX00 is alive
LX02 is alive
HA01 is alive
ICMP Host Unreachable from 192.168.1.5 for ICMP Echo sent to LX01
PRINTER is unreachable
LX01 is unreachable
LX03 is unreachable

Trochę masowania, aby pozbyć się ICMPwiadomości, daje mi ...

fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01  2>&1 | grep ' is ' | sort

HA01 is alive
LX00 is alive
LX01 is unreachable
LX02 is alive
LX03 is unreachable
PRINTER is unreachable

Jeśli chodzi o szybkość, fpingna tym starym dwurdzeniowym procesorze Intel 1,8 GHz z 4 GB pamięci RAM jest ...

time fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01 2>&1

LX00 is alive
LX02 is alive
HA01 is alive
PRINTER is unreachable
LX01 is unreachable
LX03 is unreachable

real    0m0.554s
user    0m0.000s
sys     0m0.000s

A grepi sortwydaje się tylko dodać 0.001-0.004s do czasu ...

time fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01 2>&1 | grep ' is ' | sort

HA01 is alive
LX00 is alive
LX01 is unreachable
LX02 is alive
LX03 is unreachable
PRINTER is unreachable

real    0m0.558s
user    0m0.000s
sys     0m0.000s

UWAGI

  • ICMPWiadomość nie występuje na każdym biegu.
  • Jest 2>&1to konieczne, aby ICMPkomunikat nie pojawiał się na wyjściu, gdy jest wysyłany stderrzamiast stdout.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.