Быстрее, чем пинг для проверки работоспособности компьютера?

20

Я пишу сценарий пробуждения по локальной сети для набора наших лабораторных компьютеров. У нас есть sqlite db со списком имен компьютеров, IP-адресов и MAC, и в настоящее время я проверяю каждое из них с помощью «-c1», чтобы он не работал бесконечно - но даже если это требует некоторого ожидания, есть ли более быстрый способ получить отвечать, а не пинговать? Использование ping немного замедляет работу сценария, так как для продолжения требуется ответ на ping.

Большое спасибо за любые предложения!

Джон Фенов
источник

Ответы:

20

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

Но при условии, что это достаточно хорошо, вы можете внести некоторые улучшения. Во-первых, вы можете использовать, -W1чтобы уменьшить время ожидания пинга до одной секунды. Во-вторых, вы можете заставить ваш скрипт асинхронно пинговать различные хосты (в фоновом потоке) и проверять результаты по мере необходимости, а не ждать.

С другой стороны, вы можете переосмыслить подход и сделать так, чтобы удаленные системы регистрировались каким-либо образом, когда они включены, и если система еще не зарегистрировалась, вы можете предположить, что она не работает.

mattdm
источник
Хороший вызов для -w дополнения, должен был сделать это два, хотя связка компьютеров не отвечала достаточно быстро. Возможно, стоит добавить какую-то периодическую регистрацию или рукопожатие, но сейчас я хочу, чтобы процесс был относительно внешним по отношению к компьютерам, которые я включаю.
Джон Фенов
1
Я также использую -s для отправки меньшего пакета.
Шон Дж. Гофф
3
Я буду в шоке, если отправка меньшего пакета будет иметь значение.
Mattdm
Разве они почти не отправлены с минимальным размером пакетов?
Джон Фенов
4
Они довольно маленькие; по умолчанию 56 байтов данных, которые вы можете уменьшить. Но в любом случае он меньше, чем Ethernet MTU, и больше, чем ничего, поэтому в любом случае он сводится к «одному пакету».
Mattdm
7

Для этого и был разработан fping. http://fping.sourceforge.net/

После этого вам нужно проанализировать вывод, а не полагаться на код возврата, но это намного быстрее, чем при обычном пинге.

Турбьерн Равн Андерсен
источник
Я думаю, что это довольно забавно, в описании сказано: «В отличие от ping, fping предназначен для использования в скриптах, а его вывод легко анализируется». и все же это не обеспечивает код возврата
Адам Плохер
Какими будут хорошие значения для кода возврата?
Турбьёрн Равн Андерсен
3

Это будет работать только для одного или двух компьютеров, но если вы подключите их напрямую к компьютеру, ответственному за проверку их статуса, вы можете использовать, ethtoolчтобы увидеть, активна ли ссылка.

LawrenceC
источник
Я не использовал ethtool для этого, вы бы хотели привести пример? (или может быть ссылка)?
Йохан
ethtool {network_interface} | grep "Link detected" | cut -f 3 -d ' 'вернется, yesесли машина подключена, а noесли нет.
LawrenceC
2

То, что вы могли бы сделать, это пинговать широковещательный адрес, что должно заставить все компьютеры пинговать обратно. Затем вы можете проверить этот список по сравнению с тем, что есть в SQLite, чтобы убедиться, что все компьютеры работают.

Кроме того, пинг - это, вероятно, самый быстрый способ обеспечить бодрствование компьютера в сети. Как упоминалось в другом ответе, это не дает действительно полезных данных. Если у вас есть возможность установить сценарии, вы можете добавить cronjob для проверки связи с центральным сервером, запустить задачу или просто отобразить список процессов на центральном сервере, который будет регистрировать запрос. Затем просто отметьте это, и вы узнаете, есть ли у вас проблемы, и вам не нужно каждый раз проверять их вручную.

Джош К
источник
1
Я предполагаю, что вы имеете в виду пинг широковещательного адреса, а не шлюза. На современных системах это, вероятно, не сработает. См. Unix.stackexchange.com/questions/7458/cant-ping-broadcast
mattdm
1
@mattdm: Многоадресная передача тогда? Я не знал, что большинство людей выключили это. У меня не было проблем с этим раньше.
Джош К
Ха-ха, да, спасибо, Mattdm, похожая проблема, с которой я столкнулся. не то, чтобы люди их выключали, но они, как правило, приходят с отключенной трансляцией в последнее время.
Джон Фенов
Может использовать fping ( fping.sourceforge.net ) для параллельной проверки списка хостов. Тогда вам не нужно полагаться на возможность пропинговать широковещательный адрес.
Мазианни
2

Ganglia использует многоадресный трафик для мониторинга множества хостов в кластере. Возможно, вы могли бы использовать нечто подобное? Это предполагает, что ваше сетевое оборудование разрешает многоадресный трафик между всеми хостами и вашей системой мониторинга.

jsbillings
источник
1
Выглядит как классный инструмент, но для целей этого маленького скрипта может добавить в проект ненужный кусок, оставив его пока довольно маленьким скриптом. Хотя, безусловно, буду следить за этим, похоже, инструмент, который я скоро смогу использовать, тем не менее.
Джон Фенов
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
Peer
источник
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 с 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.
DocSalvager
источник