Как я могу установить короткий тайм-аут с помощью команды ping?

49

Я пытаюсь написать скрипт, который перечисляет все хосты в моей локальной сети (их около 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

Есть ли способ установить таймаут на более низкое значение? Если нет, есть ли альтернативы?

редактировать

  • ОС Debian Lenny.
  • Хосты, которые я пытаюсь пропинговать, на самом деле являются точками доступа. Они находятся в той же VLAN и подсети, что и пользователи (для простоты развертывания и замены). Вот почему я не хочу сканировать все подсети ( 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
MiniQuark
источник

Ответы:

41

fping может быть лучшим инструментом, чем стандартный пинг, который вы используете. На какой ОС вы работаете?

  • «fping отличается от ping тем, что вы можете указать любое количество целей в командной строке или указать файл, содержащий списки целей для проверки».
  • «Вместо отправки одной цели до истечения времени ожидания или ответа, fping отправит пакет проверки связи и перейдет к следующей цели циклически».
  • «В отличие от ping, fping предназначен для использования в сценариях, поэтому его вывод предназначен для простого анализа».
AndyN
источник
1
Прекрасно работает, спасибо, это то, что я искал. Эта команда отлично справляется со своей задачей: fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 ... Все это длится пол секунды, и я получаю результаты для всех хостов одновременно. Отличный инструмент. :-))
MiniQuark
38

Для людей, которые ищут решение, которое включает в себя ping, используйте -iпереключатель.

ping -i 0.2 www.google.com

Или, если вы хотите использовать 0.1, вам нужно запустить его как root

sudo ping -i 0.1 www.google.com

Не нужно скачивать дополнительные утилиты.

Виктор Бьельхольм
источник
4
+1 от меня. Это первый результат при поиске «таймаута пинга», и это именно то, что я искал.
Стивен Джеффрис
@StevenJeffries То же самое здесь!
Люк
1
В случае мертвого хоста это решение напечатает свой первый полезный вывод примерно через 1 секунду. Это определенно неправильный ответ, как уже упоминалось @MarcelBurkhard.
Виктор Ярема
1
Проблема с этим решением заключается в том, что -i 0.1 НЕ будет ждать 100 мс, но дольше, для эхо-запросов, которые занимают более 100 мс, что приводит к потере времени.
Лламагеддон
2
Этот ответ неверен - он не меняет того, как долго pingбудет ждать ответа - скорее он просто посылает последовательные пинги быстрее ...
Mtl Dev
21

Вы можете установить короткий тайм-аут с помощью timeoutкоманды в Ubuntu / Debian:

timeout 0.2 ping -c1 fqdn || { do_work }
Джордон Бедвелл
источник
Хороший ответ! Я сейчас сделал: таймаут 1 ping -c 1 test.com
vrijdenker
1
Моя версия тайм-аута принимает только 1 секунду. timeout (GNU coreutils) 8.4,
SLM
мне нравится это решение, оно может применяться ко всем другим командам
datdinhquoc
@slm, странно, что ваша версия не поддерживает менее секунды. Это работает для меня: DURATION is a floating point number with an optional suffix: 's' for seconds (the default),... В моем случае man timeoutотчеты GNU coreutils 8.26. BWT, я использую Ubuntu 17.04.
Виктор Ярема
На самом деле это единственное, что работает, если вы хотите уменьшить тайм-ауты (хост не отвечает) ... Вы должны сделать это, хотя: время ожидания должно быть больше, чем "-c" * "-i" команды ping-
Марки
13

Я бы использовал Nmap для этой задачи.

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

Смотрите документацию nmap для более подробной информации.

Pacey
источник
Хороший звонок .. Это «Потрясающий» способ сделать это: D +1
Arenstar
Привет, я только что попробовал это, но я получил следующее сообщение об ошибке: «--host-timeout указывается в миллисекундах, если вы не квалифицируете его, добавляя« s »,« m »,« h »или« d ». Значение должно быть больше 1500 миллисекунд ".
MiniQuark
Я думаю, что проблема очевидна, время ожидания не может быть короче 1500 мс. Я думаю, что вы должны искать опции nmap для параллелизма.
темп
Это, кажется, только отправить один запрос. Я ищу непрерывное обнаружение неисправностей. Я получил здесь, используя Google "ping миллисекундный тайм-аут". Предлагает ли nmap бесконечный пинг, как ubuntu ping?
ThorSummoner
установка времени ожидания ниже секунды потребует использования привилегированного пользователя, как в ответе @ victor-bjelkholm
thrau
4

Вы можете захотеть взглянуть на инструмент arp ping, если все ваши хосты находятся в физической локальной сети. Он делает то же самое, но использует пакеты arp уровня 2 для выполнения ping. Вы можете использовать комбинацию arpping и icmp ping или фактически tcp ping, чтобы определить причину сбоя. EXample - это сбой tcp-стека, хотя в наши дни это случается редко, мы можем определить, не произошел ли сбой tcp-стека машины, поскольку машина не будет отвечать на ping, однако она будет отвечать на arp (что является другим фрагментом кода на хосте). ,

Используя комбинацию arpping, tcpping и icmp ping, вы можете узнать, произошел ли сбой службы на компьютере, произошел сбой стека tcp или машина полностью заблокирована. Если у вас есть управляемые коммутаторы Ethernet, вы можете получить данные физического канала, показывающие, действительно ли машина включена или была физически отключена. У нас была ситуация, когда машины (клиенты в общественных комнатах) были выключены, мы собирали эти данные и отправляли пробуждение по сетевым пакетам, чтобы включить машины. :-)

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

Таким образом, вы можете сделать свое решение для мониторинга настолько сложным или простым, насколько вам нравится. Мы находим, что даже самая элементарная система мониторинга - это шаг в правильном направлении, по крайней мере, какой-то администратор следит за машинами :-).

удачи!

Уникс Дворник
источник
3

У @ 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 с доменным именем.

Спасибо, парни

Digc
источник
2

Используйте ключ -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
NXT
источник
1

Если вы можете сканировать свою подсеть (или ее часть), не вызывая тревогу безопасности, и не возражаете против дополнительных данных, Angry IP Scanner быстрый, бесплатный, позволяет сортировать по статусу и может предоставлять более подробную информацию ,

Павел
источник
0

Почему бы не запустить ping в фоновом режиме с выводом во временный файл параллельно для каждого хоста? Затем спите в течение одной секунды, убейте все процессы ping, которые все еще работают, и прочитайте файлы, чтобы собрать выходные данные.

dfranke
источник
1
Я думаю, это сработает, но я искал более простое решение. Спасибо, в любом случае.
MiniQuark
Этот метод не масштабируется.
Synetech
0

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

Единственный способ ускорить процесс - запустить проверку данных и получить результаты. Это то, что делают такие инструменты, как Nagios.

BillThor
источник
2
Извините, но я действительно не думаю, что это правда. Страница справочника довольно ясна: -W указывает «Время ожидания ответа в секундах»; он не безразмерен, и хотя ping не учитывает значения ниже 1 (отсюда и вопрос), тайм-ауты в секунду не являются бессмысленными. Если вы простите меня, вы можете запутать -W с -t, который устанавливает поле IP TTL (счетчик переходов), которое ведет себя так, как вы описали, и где значения ниже 1 действительно бессмысленны.
MadHatter поддерживает Монику
-W это время, когда процесс ping ожидает ответа, и может иметь смысл установить его намного ниже счетчика переходов, когда счетчик прыжков велик, как это обычно бывает. К трем секундам вы обычно входите в условия повтора. Некоторые инструменты могут позволять использовать более точный таймер для ожидания, но для большинства случаев использования пинга секунды являются разумной единицей.
BillThor
0

Вы можете попробовать что-то вроде этого. Но это займет 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
VeggieVampire
источник
Похоже, nmapбудет правильным инструментом для работы.
kasperd
0

попробуй это:

ping -n 5 1.2.3.4.5 >nul
Мики
источник
Чем это лучше чем fping?
птенцы
-1

ping имеет опции [-t timeout] и [-W waittime], так что вы можете сделать:

ping -c 1 -t 1 -W 1 google.com
Ивелин
источник