Como posso definir um tempo limite curto com o comando ping?

40

Eu estou tentando escrever um script que lista todos os hosts na minha LAN (há cerca de 20 deles) e escreve o status do ping ao lado de cada host. Eu tenho o arquivo de concessões de DHCP, então eu tenho todos os IPs (digamos, 10.0.0.1, 10.0.0.2, etc.), tudo que eu preciso é o status do ping para cada host.

Então, meu script inicia um único ping para cada host:

ping -c 1 10.0.0.1

Infelizmente, quando um host está offline, o ping demora muito tempo para expirar. Eu verifiquei man ping , parece haver duas opções para definir o atraso de tempo limite: -w deadline e -W timeout . Eu acho que estou interessado no último.

Então eu tentei isso:

ping -c 1 -W 1 10.0.0.1

Mas esperar um segundo por host off-line ainda é muito longo. Tentei defini-lo para menos de um segundo, mas não parece levar em conta o parâmetro:

ping -c 1 -W 0.1 10.0.0.1  # timeout option is ignored, apparently

Existe uma maneira de definir o tempo limite para um valor menor? Se não, existem alternativas?

Editar

  • O O.S. é o Debian Lenny.
  • Os hosts que estou tentando fazer ping são, na verdade, pontos de acesso. Eles estão na mesma vlan e sub-rede que os usuários (para simplicidade de implantação e substituição). É por isso que não quero verificar toda a sub-rede (com ping -b , por exemplo).

Editar # 2

Aceitei a solução fping (obrigado por todas as outras respostas). Este comando faz exatamente o que eu estava procurando:

fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4

Esse comando leva no máximo 500ms para ser concluído e me fornece o status do ping de todos os hosts de uma só vez:

10.0.0.1 : [0], 84 bytes, 5.71 ms (5.71 avg, 0% loss)
10.0.0.2 : [0], 84 bytes, 7.95 ms (7.95 avg, 0% loss)
10.0.0.3 : [0], 84 bytes, 16.1 ms (16.1 avg, 0% loss)
10.0.0.4 : [0], 84 bytes, 48.0 ms (48.0 avg, 0% loss)

10.0.0.1 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 5.71/5.71/5.71
10.0.0.2 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 7.95/7.95/7.95
10.0.0.3 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 16.1/16.1/16.1
10.0.0.4 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 48.0/48.0/48.0

No Debian Lenny, a instalação é trivial:

aptitude update
aptitude install fping
    
por MiniQuark 10.11.2010 / 19:13

13 respostas

38

fping pode ser uma ferramenta melhor do que o estoque de ping que você está usando. Em que sistema operacional você está?

  • "o fping difere do ping, em que você pode especificar qualquer número de destinos na linha de comando ou especificar um arquivo contendo as listas de destinos para pingar."
  • "Ao invés de enviar para um alvo até que ele expire ou responda, o fping enviará um pacote de ping e passará para o próximo alvo de uma maneira round-robin."
  • "Diferentemente do ping, o fping deve ser usado em scripts, portanto, sua saída foi projetada para ser fácil de analisar."
por 10.11.2010 / 19:53
33

Para as pessoas que procuram uma solução que envolva ping , use a opção -i .

ping -i 0.2 www.google.com

Ou, se você quiser usar o 0,1, precisará executá-lo como root

sudo ping -i 0.1 www.google.com

Não há necessidade de baixar utilitários extras.

    
por 15.08.2014 / 20:17
15

Você pode definir um tempo limite curto com o comando timeout no Ubuntu / Debian:

timeout 0.2 ping -c1 fqdn || { do_work }
    
por 04.11.2015 / 18:48
12

Eu usaria o nmap para essa tarefa.

nmap -sP --max-retries=1 --host-timeout=1500ms 10.0.0.1

Consulte a Documentação do nmap para obter mais detalhes sobre isso.

    
por 10.11.2010 / 20:05
4

você pode querer olhar para a ferramenta arp ping se todos os seus hosts estiverem na LAN física. Ela faz a mesma coisa, mas usa os pacotes arp da camada 2 para fazer o 'ping'. Você pode usar uma combinação de arpping e icmp ping ou, na verdade, tcp ping, para reunir o que é a falha. O exemplo é um travamento da pilha tcp, embora seja raro hoje em dia, podemos descobrir se uma pilha tcp de uma máquina travou, pois a máquina não responderia ao ping, mas responderia ao arp (que é um código diferente no host) .

usando uma combinação de arpping, tcpping e icmp ping, você pode descobrir se o serviço na máquina falhou, se a pilha tcp travou ou se a máquina travou completamente. Se você tiver gerenciado switches Ethernet, poderá obter dados de link físico, revelando se a máquina está realmente ligada ou se foi fisicamente desconectada. Tínhamos uma situação em que as máquinas (clientes em salas públicas) seriam desligadas, reuníamos os dados e o rastro enviado nos pacotes de lan, para ligar as máquinas. : -)

Quaisquer soluções que você construa, se sua rede estiver ocupada, pense em implementar algum tipo de qos, de modo que seus pacotes de monitoramento tenham prioridade na rede, perder pacotes de medição devido ao congestionamento da rede pode dar falsos alarmes. Se usar o qos para monitorar pacotes, você precisará pensar em coletar dados sobre a utilização da rede.

Assim, você pode tornar sua solução de monitoramento tão complexa ou fácil quanto desejar. Descobrimos que mesmo o sistema de monitoramento mais elementar é um passo na direção certa, pelo menos algum administrador está de olho nas máquinas: -).

boa sorte!

    
por 11.11.2010 / 10:29
3

@ jordon-bedwell tem uma ótima sugestão.

@ laszlo-valko link explica que os tempos limite de ping só começam após o endereço IP ter sido determinado. Se você usa um dns e sua estação de trabalho está offline, o ping não pode determinar o endereço IP e, portanto, parece esperar aproximadamente 20 + segundos padrão antes de retornar falso.

Usar a ferramenta 'timeout' do linux fornece mais controle ao executar o ping com um nome de domínio.

Obrigado pessoal

    
por 30.11.2015 / 23:34
1

Se você pode escanear sua sub-rede (ou parte dela) sem acionar alarmes de segurança, e não se importar com um pouco de dados extras, Angry IP Scanner é rápido, gratuito, permite clicar para classificar por status e fornecer informações mais detalhadas.

    
por 10.11.2010 / 19:45
1

Use o interruptor -w , tanto no Windows quanto no Debian.

É uma maneira rápida de verificar se a máquina responde, supondo que ela responda a tempo menor que a quantidade especificada de segundos.

ping -w 1 192.168.80.105

PING 192.168.80.105 (192.168.80.105) 56(84) bytes of data.

--- 192.168.80.105 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 999ms
    
por 12.10.2016 / 10:20
0

Por que não iniciar o ping em segundo plano, com saída para um arquivo temporário, em paralelo para cada host? Em seguida, durma por um segundo, mate qualquer processo de ping que ainda esteja em execução e leia os arquivos para coletar a saída.

    
por 10.11.2010 / 19:27
0

O tempo limite é um valor inteiro que indica a distância e o tempo que o pacote pode ser enviado. Valores abaixo de 1 são insignificantes. Um valor de 1 indica que você está pingando apenas vizinhos imediatos.

A única maneira de acelerar as coisas é executar uma verificação de antecedentes e colher os resultados. É isso que ferramentas como o Nagios fazem.

    
por 10.11.2010 / 19:56
0

Você poderia tentar algo assim. Mas leva 15 minutos para ser executado.

a=258
while [ $a -ge 1 ]
do
    echo "10.0.0.$a"
    sudo ping -i 0.1 -c 1 "10.0.0.$a">>/home/$USER/output.log
   a='expr $a - 1'
done
cat /home/$USER/output.log|grep -i "icmp_req=1"
cat /dev/null>/home/$USER/output.log
    
por 02.12.2015 / 07:26
-1

tente isto:

ping -n 5 1.2.3.4.5 >nul
    
por 13.03.2017 / 19:22
-2

o ping tem as opções [-t timeout] e [-W waittime] para que você possa fazer:

ping -c 1 -t 1 -W 1 google.com
    
por 26.08.2017 / 18:35