Linux Ping: показать время ожидания

17

Как я могу заставить ping Linux показывать время ожидания запросов вместо того, чтобы пропустить вывод?

Так же, как Windows-версия пинга.

Andre
источник
Как вы не показываете таймаут?
Майкл

Ответы:

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

И использование это что-то вроде:

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

bruno.braga
источник
Можете ли вы изменить его, чтобы сообщить процент потери пакетов и рассчитывать на каждую строку?
Пол Халлен
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.

ской
источник
Привет scoy, добро пожаловать в Super User и спасибо за ответ на этот вопрос! Похоже, это зависит от версии ping; на Debian Wheezy я получаю " ping: invalid option -- 'O'", но на Джесси это работает, как вы заметили. Вы можете обновить свой ответ, чтобы включить эту информацию. (Я также представил предлагаемое изменение для использования предварительно отформатированного текста для вывода и информации из man-
страницы
5

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

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

По сути, отправляет один ICMP, который истекает через секунду без вывода, и использует код выхода для контроля дальнейших действий.

entropo
источник
2

У обычного нет способа pingсделать это. Если вы пытаетесь что-то написать, у вас есть несколько вариантов:

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

Если эхо-запрос не пройден, $?будет 1, если эхо-запрос успешен, $?будет 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

Боюсь, но нет 100% -ного решения этого со стандартным пингом. Даже с 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
nvluan
источник
Однако обратите внимание, что после нескольких прогонов fping спорадические тайм-ауты не влияют на потери при печати (1 пакет из 1000 - потеря 0,1%, а fping будет печатать 0%). Не говоря уже о том, что гораздо легче заметить «тайм-аут запроса», чем поймать время, когда 18% превращается в 19% (не говоря уже о том, что вы должны игнорировать момент, когда 18%
снижается
fpingэто хорошо, и, кстати, -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 пакетов

Кстати: это один из крайне редких примеров функциональности, который мне действительно не хватает в инструменте Linux CLI, но я нахожусь в инструменте windows. Исключение, которое подтверждает правило, как говорится :-)

ndemou
источник
0

Если вы хотите выполнить непрерывный пинг, как окна и с отметкой времени, используйте этот. Не стесняйтесь заменить 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 ~]$ 
Sabrina
источник
0

Обычный пинг действительно показывает вам тайм-ауты. Глядя на значение 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.

Клайв Герада
источник