Linux Ping: Показати час очікування


17

Як я можу змусити Linux ping показувати запити 'time out', а не опускати вихід?

Так само, як і для Windows версії ping.


Як не показувати час очікування?
Майкл

Відповіді:


12

fping не працював для мене ... У моєму випадку більшість часу я хочу бачити, що це в основному під час перезавантаження сервера ... це працює дуже добре в Windows ...

Я будую простий сценарій (розширюючи @entropo відповідь), щоб допомогти мені в цьому, що може допомогти відповісти на це питання:

https://gist.github.com/brunobraga/7259197

#!/bin/bash

host=$1

if [ -z $host ]; then
    echo "Usage: `basename $0` [HOST]"
    exit 1
fi

while :; do
    result=`ping -W 1 -c 1 $host | grep 'bytes from '`
    if [ $? -gt 0 ]; then
        echo -e "`date +'%Y/%m/%d %H:%M:%S'` - host $host is \033[0;31mdown\033[0m"
    else
         echo -e "`date +'%Y/%m/%d %H:%M:%S'` - host $host is \033[0;32mok\033[0m -`echo $result | cut -d ':' -f 2`"
        sleep 1 # avoid ping rain
    fi
done

А використання - це щось на зразок:

введіть тут опис зображення


Чи можете ви змінити його, щоб повідомити про відсоток втрат пакету і рахувати в кожному рядку?
Pol Hallen

21

Найкраще, що я знайшов - це використовувати прапор -O (Зверніть увагу, що він працює не у всіх дистрибутивах - за допомогою Linux Mint 17.1 Rebecca IPUTILS-PING 3: 20121221-4ubuntu1.1)

$ ping -O 10.10.5.1

64 bytes from 10.10.5.1: icmp_seq=53 ttl=245 time=460 ms
no answer yet for icmp_seq=54
64 bytes from 10.10.5.1: icmp_seq=55 ttl=245 time=265 ms
64 bytes from 10.10.5.1: icmp_seq=56 ttl=245 time=480 ms
no answer yet for icmp_seq=57
64 bytes from 10.10.5.1: icmp_seq=58 ttl=245 time=348 ms
64 bytes from 10.10.5.1: icmp_seq=59 ttl=245 time=515 ms
no answer yet for icmp_seq=60
64 bytes from 10.10.5.1: icmp_seq=61 ttl=245 time=320 ms
64 bytes from 10.10.5.1: icmp_seq=62 ttl=245 time=537 ms

На чоловіковій сторінці:

-O Report outstanding ICMP ECHO reply before sending next packet. This is useful together with the timestamp -D to log output to a diagnostic file and search for missing answers.


Привіт, привіт, ласкаво просимо до Супер Користувача та дякуємо за відповідь на це питання! Схоже, це залежить від версії ping; на Debian Wheezy я отримую " ping: invalid option -- 'O'", але на Джессі це працює як ви зазначаєте. Ви можете оновити свою відповідь, щоб включити цю інформацію. (Я також подав запропоновану
редакцію,

5

Коли я використовую ping, щоб побачити, чи знаходиться хост у скриптах оболонки, я роблю щось подібне:

ping -W 1 -c 1 $HOST 2>&1 > /dev/null || (echo -n "dead!"; false) && command-that-needs-host-to-be-up

В основному, надсилає один ICMP, який тайм-аут замикається в секунду без виводу і використовує код виходу для передачі подальших дій.


2

Немає способів для загальних pingзробити це. Якщо ви намагаєтесь щось скриптувати, у вас є деякі варіанти:

ping -c 2 <ip>
RESULT=$?
echo $RESULT
1

Якщо ping не вдасться, $?буде 1, якщо ping вдалий, $?буде 0.

Іншим варіантом є використання, fpingяке дуже схоже на Cisco ping:

$ fping 200.1.1.1
200.1.1.1 is unreachable
$ fping 192.168.1.1
192.168.1.1 is alive

2

Наведений вище сценарій bruno.braga працює чудово, проте особисто я вважаю за краще використовувати псевдонім у профілі оболонки (наприклад, .bashrc), щоб він міг бути випадком щоденного використання.

Моє рішення нижче також автоматично обчислює номер послідовності запиту ECHO:

alias pingt='__pingt() { s=0; while :; do s=$(($s+1)); result=$(ping $1 -c1 -W1 |/bin/grep from) && echo "$result, seq=$s" && sleep 1 || echo timeout; done }; __pingt $1'

Ось вихідний приклад, коли хост нестабільний з таймаутом:

$ pingt 10.10.10.126
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.235 ms, seq=1
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.228 ms, seq=2
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.209 ms, seq=3
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.241 ms, seq=4
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.195 ms, seq=5
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.211 ms, seq=6
timeout
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.267 ms, seq=8
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.232 ms, seq=9
^C

Звичайно, недолік такий: відсутність статистики наприкінці, коли натискається CTRL-C. При бажанні це також було б можливим обчислити min / avg / max за допомогою сценарію оболонки, mdev далеко виходить за рамки.


1

Я боюся, але не існує стовідсоткового рішення для цього зі стандартним ping. Навіть з ping -v для багатослівного виводу ping буде мовчати в разі очікування. Ви можете спробувати використовувати:

ping -w 2 192.168.199.1
PING 192.168.199.1 (192.168.199.1) 56(84) bytes of data.

--- 192.168.199.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1007ms

Це припинить пінг через 2 секунди, а потім покаже кількість переданих пакетів та втрату пакету. Іншим варіантом буде використання mtr .


1
nomad@local:~$ fping -l -e 8.8.8.8

8.8.8.8 : [0], 92 bytes, 183 ms (183 avg, 0% loss)
8.8.8.8 : [1], 92 bytes, 61.4 ms (122 avg, 0% loss)
8.8.8.8 : [2], 92 bytes, 164 ms (136 avg, 0% loss)
8.8.8.8 : [3], 92 bytes, 163 ms (143 avg, 0% loss)
8.8.8.8 : [5], 92 bytes, 158 ms (146 avg, 16% loss)
8.8.8.8 : [6], 92 bytes, 122 ms (142 avg, 14% loss)
8.8.8.8 : [7], 92 bytes, 134 ms (141 avg, 12% loss)
8.8.8.8 : [8], 92 bytes, 130 ms (140 avg, 11% loss)

nomad@local:~$ fping -version
fping: Version 3.2
fping: comments to david@schweikert.ch

Однак зауважте, що після пробігу пальців протягом декількох хвилин спорадичні тайм-аути мають нульовий вплив на друковані втрати (1 пакет з 1000 становить 0,1% втрати, а fping збереже друк 0%). Не кажучи вже про те, що набагато простіше помітити "тайм-аут запиту", ніж вловлювати час, який 18% перетворюється на 19% (не кажучи вже про те, що вам доведеться ігнорувати момент, коли 18% відхиляється до 17%)
ndemou

fpingце добре, а BTW -eне потрібен, коли -lабо-c додається, може просто використовувати fping -l 8.8.8.8, вихід такий же.
Ерік Ван

0

Мені дуже подобається сценарій оболонки від Бруно. Я додав рядок для створення файлу з усіма відмовами.

echo -e " date +'%Y/%m/%d %H:%M:%S'- host $ host is \ 033 [0; 31mdown \ 033 [0m" >> ./lostpackets.txt


0

Без нічого сценарію

ping -f -i 1 hostname

Переваги : стандартна команда Linux - нічого встановити та скриптувати.

Недоліки :

  1. НІЩО не надруковано для пакетів, на які успішно відповіли
  2. Це робить дратівливий звуковий сигнал для пакетів, які отримують відповідь успішно
  3. Візуальна індикація тайм-аутів є мінімально можливою (невелика крапка залишається на екрані, коли пакет вичерпується).

З мінімальним сценарієм

#!/bin/bash
while :; do
    ping -W1 -c 1 "$@" | grep 'bytes from '
    case $? in
        0 ) sleep 1 ;;
        1 ) echo -e "request timeout" ;;
        * ) exit ;;
    esac
done

Недоліки : ви не отримуєте статистику наприкінці, і ви не можете використовувати ці 3 варіанти пінгу:

  1. -i щоб змінити інтервал між відправленням пакетів (це жорстко закодовано до 1сек)
  2. -W щоб змінити час очікування (це жорстко закодовано в 1 сек)
  3. -c зупинити після відправки N пакетів

BTW: Це один з надзвичайно рідкісних прикладів функціональності, який мені дуже не вистачає в інструменті Linux CLI, але я знаходжу в інструменті Windows. Виконання, яке підтверджує правило, як кажуть :-)


0

Якщо ви хочете виконувати безперервний ping так само, як Windows та з позначкою часу, використовуйте цей. Не соромтеся замінити 192.168.0.1власну IP-адресу

while :; do ping -c 1 -t 1 192.168.0.1 > /dev/null && echo "`date` >>> Reply OK" && sleep 1 || echo "`date` >>> Request timed out"; done

Приклад Відповідь ОК

[user@Linux ~]$ while :; do ping -c 1 -t 1 192.168.0.1 > /dev/null && echo "`date` >>> Reply OK" && sleep 1 || echo "`date` >>> Request timed out"; done
Wed Jan  3 03:41:49 GMT 2018 >>> Reply OK
Wed Jan  3 03:41:50 GMT 2018 >>> Reply OK
Wed Jan  3 03:41:51 GMT 2018 >>> Reply OK
^Z
[23]+  Stopped                 sleep 1
[user@Linux ~]$

Приклад запиту вичерпано

[user@Linux ~]$ while :; do ping -c 1 -t 1 192.168.0.254 > /dev/null && echo "`date` >>> Reply OK" && sleep 1 || echo "`date` >>> Request timed out"; done
Wed Jan  3 03:41:36 GMT 2018 >>> Request timed out
Wed Jan  3 03:41:37 GMT 2018 >>> Request timed out
Wed Jan  3 03:41:38 GMT 2018 >>> Request timed out
^Z
[22]+  Stopped                 ping -c 1 -t 1 192.168.0.254 >/dev/null
[user@Linux ~]$ 

0

Звичайний Ping насправді показує час очікування. Переглядаючи seq = значення між пінгами, ви можете визначити, скільки тайм-аутів

64 bytes from 192.168.12.46: icmp_seq=8 ttl=62 time=46.7 ms
64 bytes from 192.168.12.46: icmp_seq=11 ttl=62 time=45.3 ms

EG 3 сталися між вищезгаданими 2 пінгами, оскільки перший був, seq=8а другий був seq=11 (9 та 10 були тайм-аутами) seq=sequence.

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