Як я можу встановити короткий час очікування за допомогою команди 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

Чи є спосіб встановити час очікування на нижче значення? Якщо ні, то чи є альтернативи?

Редагувати

  • ОС - Дебіан Ленні.
  • Хости, на які я намагаюся пінг, - це фактично точки доступу. Вони перебувають у тій же vlan і підмережі, що і користувачі (для простоти розгортання та заміни). Ось чому я не хочу сканувати всю підмережу (наприклад, з a ping -b).

Редагувати №2

Я прийняв fpingрішення (дякую за всі інші відповіді). Ця команда робить саме те, що я шукав:

fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4

Ця команда займає щонайбільше 500 мс, і надає мені статус пінгу всіх хостів відразу:

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

Відповіді:


41

fping може бути кращим інструментом, ніж використовуваний біржовий пінг. На якій ОС ви працюєте?

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

1
Чудово працює, дякую, це те, що я шукав. Ця команда прекрасно виконує завдання: fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 ... Вся справа триває півсекунди, і я отримую результати для всіх хостів відразу. Відмінний інструмент. :-))
MiniQuark

37

Для людей, які шукають рішення, яке стосується 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 мс, таким чином скидаючи таймінги.
Llamageddon

2
Ця відповідь невірна - вона не змінює, як довго pingбуде чекати відповіді - швидше вона просто надсилає послідовні
пінгви

21

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

timeout 0.2 ping -c1 fqdn || { do_work }

Хороша відповідь! Я зробив: timeout 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 .


Хороший дзвінок .. Це спосіб "Awesome" зробити це: D +1
Arenstar

Привіт, я просто спробував це, але мені надійшло таке повідомлення про помилку: "--host-timeout задається в мілісекундах, якщо ви не визначите його, додавши" s "," m "," h "або" d ". має бути більше 1500 мілісекунд ".
MiniQuark

Я думаю, що проблема очевидна, час очікування не може бути коротшим, ніж 1500 мс. Тоді ви повинні шукати параметри nmap, що регламентують паралелізм, я думаю.
темний

Здається, це надсилає лише один запит. Я шукаю постійне виявлення несправностей, я потрапив сюди за допомогою Googling "ping milisecond timeout", чи nmap пропонує infinie-pings, як ubuntu ping?
ThorSummoner

встановлення тайм-ауту на щось нижче секунди передбачає використання привілейованого користувача, як у відповіді @ victor-bjelkholm
thrau

4

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

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

Які рішення, які ви будуєте, якщо ваша мережа зайнята, подумайте про те, щоб реалізувати якийсь тип 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 забезпечує більший контроль під час запуску ping з доменним іменем.

Спасибі, хлопці


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

1

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


0

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


1
Я думаю, це спрацювало б, але я шукав більш простого рішення. Все одно, дякую.
MiniQuark

Цей метод не збільшує масштаб.
Synetech

0

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

Єдиний спосіб прискорити роботу - це перевірити перегляд фону та отримати результати. Це те, що роблять такі інструменти, як Nagios.


1
Вибачте, але я дійсно не думаю, що це правда. На сторінці man досить зрозуміло, що -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

Схоже, це nmapбув би правильний інструмент для роботи.
kasperd


-1

у ping є параметри [-t timeout] та [-W waittime], щоб ви могли:

ping -c 1 -t 1 -W 1 google.com
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.