Перейти к содержимому

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

14

Как сделать так, чтобы Linux пропинговал, чтобы запросы показывали «тайм-аут» вместо пропуска вывода?

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

28 998 просмотров
Andre спросил 15 лет назад
A 173

11 ответов

13

The best thing I found was to use the -O flag (Note that it does not work on all distros - using 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 

From the man page:

-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: неверный параметр - 'O' ", но в случае с Джесси это работает, как вы заметили. Вы можете обновить свой ответ, чтобы включить эту информацию. (Я также представил предлагаемое изменение, чтобы использовать предварительно отформатированный текст для вывода и информацию из справочной страницы)

bertieb · 11 лет назад · 0
scoy ответил 11 лет назад
S 131
11
Принятый ответ

fping did not work for me... In my case, most of the time I want to see this is basically during server rebooting... this works pretty nice on Windows...

I build a simple script (expanding @entropo answer) to help me on that, which may help answering this question:

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 

And usage is something like:

enter image description here

Можете ли вы изменить его, чтобы сообщить процент потери пакетов и рассчитывать на каждую строку?

Pol Hallen · 10 лет назад · 0
bruno.braga ответил 12 лет назад
B 311
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 ответил 15 лет назад
E 622
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 находится далеко за рамками.

Jackie Yeh ответил 9 лет назад
J 121
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 .

0
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 

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

ndemou · 11 лет назад · 0
nvluan ответил 13 лет назад
N 1
0

I really like the shell script from Bruno. I added a line to create a file with all of the failures.

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

Dave Honsvick ответил 11 лет назад
D 1
0

Without scripting anything

ping -f -i 1 hostname

Advantages: standard Linux command - nothing to install or script.

Disadvantages:

  1. NOTHING is printed for packets that get replied successfully
  2. It makes an annoying beep for packets that get replied successfully
  3. The visual indication of timeouts is as minimal as can get (a small dot stays on screen when a packet times out).

With a minimal script

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

Disadvantages: You get no statistics at the end and you can't use these 3 ping options:

  1. -i to alter the interval between sending packets (it's hardcoded to 1sec)
  2. -W to alter the timeout (it's hardcoded to 1sec)
  3. -c to stop after sending N packets

BTW: This is one of the extremely rare examples of functionality I really miss from a Linux CLI tool but I find in a windows tool. The execption that proves the rule as they say :-)

ndemou ответил 11 лет назад
N 300
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 ответил 8 лет назад
S 192
Загрузка ответов…