Я пытаюсь написать сценарий, который перечисляет все хосты в моей локальной сети (их около 20) и записывает статус ping рядом с каждым хостом. У меня есть файл аренды DHCP, поэтому у меня есть все IP-адреса (скажем, 10.0.0.1, 10.0.0.2 и т. Д.), Все, что мне нужно, это статус ping для каждого хоста.
Итак, мой скрипт запускает один пинг для каждого хоста:
ping -c 1 10.0.0.1
К сожалению, когда хост находится в автономном режиме, время ожидания пинга занимает много времени. Я проверил man ping
, кажется, есть два варианта установки задержки тайм-аута: -w deadline
и -W timeout
. Думаю, последнее меня интересует.
Итак, я попробовал это:
ping -c 1 -W 1 10.0.0.1
Но ожидание одной секунды на каждый автономный хост по-прежнему слишком долго. Я попытался установить значение менее секунды, но похоже, что параметр вообще не учитывается:
ping -c 1 -W 0.1 10.0.0.1 # timeout option is ignored, apparently
Есть ли способ установить меньшее значение тайм-аута? Если нет, есть ли альтернативы?
редактировать
ping -b
например).Редактировать # 2
Я принял fping
решение (спасибо за все остальные ответы). Эта команда делает именно то, что я искал:
fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4
Эта команда занимает не более 500 мс и дает мне статус ping для всех хостов сразу:
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
В Debian Lenny установка тривиальна:
aptitude update
aptitude install fping
fping может быть лучшим инструментом, чем стандартный пинг, который вы используете. На какой ОС вы работаете?
Для людей, ищущих решение, включающее ping
, использовать -i
переключатель.
ping -i 0.2 www.google.com
Или, если вы хотите использовать 0.1, вам нужно запустить его как root
sudo ping -i 0.1 www.google.com
Не нужно скачивать дополнительные утилиты.
Вы можете установить короткий тайм-аут с помощью timeout
команда в Ubuntu / Debian:
timeout 0.2 ping -c1 fqdn || { do_work }
Для этой задачи я бы использовал nmap.
nmap -sP --max-retries=1 --host-timeout=1500ms 10.0.0.1
Увидеть Документация по nmap для получения более подробной информации об этом.
вы можете посмотреть на инструмент arp ping, если все ваши хосты находятся в физической LAN. Он делает то же самое, но использует пакеты arp уровня 2 для выполнения ping. Вы можете использовать комбинацию arpping и icmp ping, или фактически tcp ping, чтобы узнать, в чем заключается сбой. Примером является сбой стека tcp, хотя в наши дни это редкость, мы могли бы обнаружить, произошел ли сбой стека tcp машины, поскольку машина не реагировала на ping, однако она отвечала бы на arp (который представляет собой другой фрагмент кода на хосте) .
Используя комбинацию arpping, tcpping и icmp ping, вы можете узнать, произошел ли сбой службы на машине, произошел сбой в стеке tcp или машина полностью заблокирована. Если у вас есть управляемые коммутаторы Ethernet, вы можете получить данные физического соединения, показывающие, действительно ли машина включена или была физически отключена от сети. У нас была ситуация, когда машины (клиенты в общественных помещениях) были выключены, мы собрали эти данные и отправили пробуждение на LAN-пакетах, чтобы включить машины. :-)
Какие бы решения вы ни создавали, если ваша сеть занята, подумайте о внедрении некоторого вида QOS, чтобы ваши пакеты мониторинга имели приоритет в сети, а потеря пакетов измерений из-за перегрузки сети может давать ложные тревоги. Если вы используете qos для мониторинга пакетов, вам нужно подумать о сборе данных об использовании сети.
Таким образом, вы можете сделать свое решение для мониторинга настолько сложным или простым, насколько захотите. Мы считаем, что даже самая простая система мониторинга - это шаг в правильном направлении, по крайней мере, какой-то администратор следит за машинами :-).
удачи!
Использовать -w как в Windows, так и в Debian.
Это быстрый способ проверить, отвечает ли машина вообще, при условии, что она ответит за время меньше указанного количества секунд.
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
@ jordon-bedwell имеет отличное предложение.
@ laszlo-valko https://stackoverflow.com/questions/20359487/why-does-ping-not-timeout-in-linux объясняет, что тайм-ауты ping начинаются только после определения IP-адреса. Если вы используете DNS, а ваша рабочая станция отключена, ping не может определить IP-адрес, и поэтому, похоже, ожидает примерно 20 + секунд по умолчанию, прежде чем вернуть false.
Использование инструмента linux 'timeout' обеспечивает больший контроль при запуске ping с доменным именем.
Спасибо, парни
Если вы можете сканировать свою подсеть (или ее часть), не вызывая сигналов безопасности, и не возражаете против дополнительных данных, Злой IP-сканер быстрый, бесплатный, позволяет щелкнуть для сортировки по статусу и может предоставить более подробную информацию.
Почему бы не запустить пинг в фоновом режиме с выводом во временный файл параллельно для каждого хоста? Затем засыпайте на одну секунду, завершите все процессы ping, которые все еще работают, и прочитайте файлы, чтобы собрать вывод.
Тайм-аут - это целое число, указывающее, как далеко и долго может быть отправлен пакет. Значения ниже 1 не имеют смысла. Значение 1 указывает, что вы проверяете связь только с ближайшими соседями.
Единственный способ ускорить процесс - запустить проверку данных и собрать результаты. Это то, что делают такие инструменты, как Nagios.
Вы можете попробовать что-то подобное. Но бегать нужно минут 15.
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
попробуй это:
ping -n 5 1.2.3.4.5 >nul
ping имеет параметры [-t тайм-аут] и [-W время ожидания], поэтому вы можете:
ping -c 1 -t 1 -W 1 google.com