Швидший спосіб, ніж ping для перевірки наявності комп'ютера в Інтернеті?


20

Я пишу пробудження на локальному сценарії для набору наших лабораторних комп'ютерів. У нас є sqlite db зі списком комп'ютерних імен хостів, IP-адрес та MAC-систем, і зараз я пингую кожне з них "-c1", тому він не працює без кінця - але навіть це вимагає очікування, чи є швидший спосіб отримати відповідь, а не пінг? Здається, використання ping трохи уповільнить сценарій, оскільки для продовження потрібні відповіді ping.

Дякую за будь-які пропозиції!

Відповіді:


20

Надіслати один пакет і чекати відповіді буде одним з найшвидших способів, і ping - це чудовий спосіб зробити це. Насправді, залежно від вашого випадку використання, я стверджую, що це занадто швидко , оскільки він насправді не говорить вам, чи система насправді робить щось корисне, лише те, що мережева підсистема ядра жива та налаштована.

Але якщо припустити, що це досить добре, ви можете внести деякі вдосконалення. По-перше, ви можете скористатися, -W1щоб зменшити тайм-аут пінг до однієї секунди. По-друге, ви можете зробити ваш сценарій пінг різних хостів асинхронно (у фоновому потоці) та перевірити результати за потребою, а не чекати.

Крім того, ви можете переосмислити підхід і примусити віддалені системи якось зареєструватися, коли вони не ввійшли, і якщо система не зареєструвалася, ви можете припустити, що вона знищена.


Хороший дзвінок на додаток -w, мусив зробити це двома, хоча група комп'ютерів не реагувала досить швидко. Можливо, слід також додати якусь періодичну реєстрацію або рукостискання, але поки що хочу, щоб процес був відносно зовнішніх комп’ютерів, на яких я включаю.
Джон Пеньюв

1
Я також використовую -s, щоб надіслати менший пакет.
Шон Дж. Гофф

3
Я буду шокований, якщо надіслати менший пакет має значення.
mattdm

Хіба вони вже майже не надсилаються при мінімальному розмірі пакетів?
Джон Phenow

4
Вони досить маленькі; за замовчуванням 56 байтів даних, які ви можете зменшити. Але в будь-якому випадку він менший, ніж ethernet MTU і більший, ніж нічого, тому в будь-якому випадку він зводиться до "одного пакета".
mattdm

7

Саме для цього був розроблений fping. http://fping.sourceforge.net/

Після цього потрібно проаналізувати вихід, а не покладатися на код повернення, але це набагато швидше, ніж робити звичайний пінг.


Я думаю, що це якось смішно в описі йдеться: "На відміну від ping, fping призначений для використання в сценаріях, і його вихід легко розбирати". але він не містить коду повернення
Адам Плочер

Які добрі значення мали б код повернення?
Thorbjørn Ravn Andersen

3

Це працює лише для одного або двох комп’ютерів, але якщо ви підключите їх безпосередньо до комп’ютера, відповідального за перевірку їх стану, ви можете використовувати, ethtoolщоб побачити, чи посилання активне чи ні.


Я не використовував для цього ettool, чи хотіли б ви навести приклад? (а може посилання)?
Йоган

ethtool {network_interface} | grep "Link detected" | cut -f 3 -d ' 'повернеться, yesякщо підключена машина, а noякщо її немає.
LawrenceC

2

Що ви могли зробити це, пінг-код широкомовної програми, який повинен викликати повернення всіх комп’ютерів. Тоді ви можете перехрестити перевірку цього списку на предмет того, що у вас є в SQLite, щоб переконатися, що всі комп'ютери працюють.

Крім того, що пінг - це, мабуть, найшвидший спосіб забезпечити пробудження комп'ютера в мережі. Як згадується в іншій відповіді, ця інформація не дає дійсно корисних даних. Якщо у вас є можливість встановлення скриптів, ви можете додати cronjob до ping на центральний сервер, виконати завдання або просто переймати список процесів на центральний сервер, який записуватиме запит. Потім просто перевірте, що підкаже, чи є у вас проблеми, які не потрібно щоразу перевіряти вручну.


1
Я припускаю, що ви маєте на увазі пінг-адресу широкомовної, а не шлюзової. У сучасних системах це, ймовірно, не спрацює. Дивіться unix.stackexchange.com/questions/7458/cant-ping-broadcast
mattdm

1
@mattdm: Тоді багатоадресна передача ? Я не знав, що більшість людей відключили це. Я з цим раніше не стикався з проблемами.
Джош К

Так, спасибі mattdm, подібну проблему, яку ти бачиш, я зіткнувся. Справа не в тому, що люди їх відключають, але вони, як правило, приходять з трансляцією останнім часом, мабуть.
Джон Phenow

Неможливо використовувати fping ( fping.sourceforge.net ) для паралельного запису списку хостів. Тоді вам не доведеться розраховувати на те, щоб мати змогу надіслати пінг-адресу.
mazianni

2

Ganglia використовує багатоадресний трафік для контролю багатьох хостів у кластері, можливо, ви могли б використовувати щось подібне? Це передбачає, що ваше мережеве обладнання дозволяє надсилати трафік між усіма хостами та вашою системою моніторингу.


1
Виглядає як класний інструмент, але для цього маленького сценарію можна додати трохи зайвого шматка до проекту, зберігаючи його як досить невеликий сценарій. Очевидно, я все-таки слідкую за цим, схоже, інструмент, який я можу скоріше використати.
Джон Phenow,

0

У мене була така ж проблема, і я придумав наступний (швидкий і брудний) сценарій. Це по суті видаляє всі пінгви як окремі завдання паралельно і сканує всю / 24 підмережу за 3 секунди; зауважте, що я чомусь не намагався дізнатися, що не можу тут використати код результату ping, але grep -v зробив цю роботу:

#!/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

В С,

/* 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

Я знайшов fping -r0 ...швидку відповідь.

Опція -r(повтор) здається швидшою, ніж аналогічна -c(кількість). Використання -r0результатів лише в одному пінгу, що надсилається, і вихід значно скорочений порівняно з іншими параметрами.

У моїй системі ...

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

Призводить до...

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

Невеликий масаж, щоб позбутися від ICMPповідомлень, дає мені ...

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

Що стосується швидкості, то fpingна цьому старому 1,8 ГГц Intel Dual-Core з 4 Гб оперативної пам'яті є ...

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

А grepта , sortздається, тільки додати 0.001-0.004s на той час ...

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

ПРИМІТКИ

  • ICMPПовідомлення не відбувається при кожному запуску.
  • 2>&1Необхідно , щоб запобігти ICMPповідомлення від з'являтися на виході , як він відправляється stderrзамість stdout.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.