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

Можете ли вы изменить его, чтобы сообщить процент потери пакетов и рассчитывать на каждую строку?
Когда я использую ping, чтобы увидеть, включен ли хост в скриптах оболочки, я делаю что-то вроде этого:
ping -W 1 -c 1 $HOST 2>&1 > /dev/null || (echo -n "dead!"; false) && command-that-needs-host-to-be-up
По сути, отправляет один ICMP, который истекает через секунду без вывода, и использует код выхода для контроля дальнейших действий.
У обычного нет способа 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 Приведенный выше скрипт 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 находится далеко за рамками.
Боюсь, но нет 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 .
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%)
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
Without scripting anything
ping -f -i 1 hostname
Advantages: standard Linux command - nothing to install or script.
Disadvantages:
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:
-i to alter the interval between sending packets (it's hardcoded to 1sec)-W to alter the timeout (it's hardcoded to 1sec)-c to stop after sending N packetsBTW: 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 :-)
Если вы хотите выполнять непрерывный пинг, как окна и с отметкой времени, используйте этот. Не стесняйтесь заменить 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 ~]$ Ctrl+K или / — быстрый поиск Начните вводить запрос для поиска по сайту
Как вы * не * показываете тайм-аут?