Ping Linux: Mostrar tempo limite

17

Como posso fazer o ping do Linux mostrar o tempo limite das solicitações em vez de omitir a saída?

Assim como a versão Windows do ping.

Andre
fonte
Como você não mostra o tempo limite?
Michael

Respostas:

12

O fping não funcionou para mim ... No meu caso, na maioria das vezes eu quero ver isso basicamente durante a reinicialização do servidor ... isso funciona muito bem no Windows ...

Eu construo um script simples (expandindo a resposta @entropo) para me ajudar nisso, o que pode ajudar a responder a esta pergunta:

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

E o uso é algo como:

insira a descrição da imagem aqui

bruno.braga
fonte
Você pode modificá-lo para relatar a porcentagem de perda de pacotes e contar com todas as linhas?
Pol Hallen
21

A melhor coisa que encontrei foi usar o sinalizador -O (observe que ele não funciona em todas as distros - usando 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

Na página do manual:

-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.

escandaloso
fonte
Oi escandaloso, bem-vindo ao Super Usuário e obrigado pela resposta a esta pergunta! Isso parece depender da versão do ping; no Debian Wheezy recebo " ping: invalid option -- 'O'", mas no Jessie funciona como você observa. Você pode atualizar sua resposta para incluir essas informações. (Eu também apresentaram uma edição sugerido o uso de texto pré-formatado para a saída e a informação da página de manual)
bertieb
5

Quando eu uso o ping para ver se um host está em scripts de shell, faço algo assim:

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

Basicamente, envia um ICMP que atinge o tempo limite em um segundo sem saída e usa o código de saída para bloquear outras ações.

entropo
fonte
2

Não há como o comum pingfazer isso. Se você está tentando criar um script, você tem algumas opções:

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

Se o ping falhar, $?será 1, se o ping for bem-sucedido, $?será 0.

A outra opção é usar fpingisso funciona muito como a Cisco ping:

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

fonte
2

O script acima de bruno.braga funciona muito bem, no entanto, pessoalmente, eu prefiro um alias de uso em um perfil de shell (como .bashrc), para que possa ser um caso de uso diário.

Minha solução abaixo também calcula o número de sequência da solicitação ECHO automaticamente:

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'

Aqui está o exemplo de saída quando o host está instável com um tempo limite:

$ 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

Obviamente, a desvantagem é: nenhuma estatística no final quando CTRL-C é pressionado. Se desejado, também seria possível calcular min / avg / max pelo shell script, o mdev está muito além do escopo.

Jackie Yeh
fonte
1

Receio, mas não há solução 100% para isso com ping padrão. Mesmo com ping -v para saída detalhada, o ping seria silencioso em caso de tempo limite. Você pode tentar usar:

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

Isso interromperia o ping após 2 segundos e mostraria o número de pacotes transmitidos e a perda de pacotes. Outra opção seria usar o mtr .


fonte
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 [email protected]
nvluan
fonte
Observe, no entanto, que depois que o fping for executado por alguns minutos, os intervalos de tempo esporádicos terão efeito nulo na perda impressa (1 pacote de 1000 é perda de 0,1% e o fping continuará imprimindo 0%). Sem mencionar que é muito mais fácil notar um "tempo limite de solicitação" do que pegar o tempo em que 18% chega a 19% (sem mencionar que você precisa ignorar o momento em que 18% volta para 17%)
ndemou
fpingé bom, e BTW -enão é necessário quando -lou -cé adicionado, poderia apenas usar fping -l 8.8.8.8, a saída é a mesma.
Eric Wang
0

Eu realmente gosto do shell script do Bruno. Eu adicionei uma linha para criar um arquivo com todas as falhas.

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

Dave Honsvick
fonte
0

Sem escrever nada

ping -f -i 1 hostname

Vantagens : comando padrão do Linux - nada para instalar ou script.

Desvantagens :

  1. NADA é impresso para pacotes que são respondidos com sucesso
  2. Emite um sinal sonoro irritante para pacotes que são respondidos com sucesso
  3. A indicação visual dos tempos limite é o mínimo possível (um pequeno ponto permanece na tela quando um pacote atinge o tempo limite).

Com um script mínimo

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

Desvantagens : você não obtém estatísticas no final e não pode usar estas três opções de ping:

  1. -i para alterar o intervalo entre o envio de pacotes (é codificado para 1 segundo)
  2. -W para alterar o tempo limite (é codificado para 1 segundo)
  3. -c parar após enviar N pacotes

BTW: Este é um dos exemplos extremamente raros de funcionalidade que realmente sinto falta de uma ferramenta CLI do Linux, mas encontro em uma ferramenta do Windows. A execução que prova a regra como eles dizem :-)

ndemou
fonte
0

Se você deseja executar um ping contínuo, exatamente como o Windows e com carimbo de data e hora, use este. Sinta-se livre para substituir 192.168.0.1por seu próprio endereço 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

Exemplo de resposta OK

[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 ~]$

A solicitação de exemplo expirou

[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
fonte
0

O Ping normal realmente mostra tempos limite. Observando o valor seq = entre pings, você pode dizer quantos tempos limites

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

Ocorreram três intervalos de tempo do EG 3 entre os 2 pings acima desde o primeiro seq=8e o segundo foi seq=11 (9 e 10 foram intervalos) seq=sequence.

Clive Gerada
fonte