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

49

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

Portanto, meu script lança um único ping para cada host:

ping -c 1 10.0.0.1

Infelizmente, quando um host está offline, o ping demora muito tempo. Eu verifiquei man ping, parece haver duas opções para definir o atraso do tempo limite: -w deadlinee -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 offline ainda é muito longo. Tentei configurá-lo para menos de um segundo, mas ele não parece levar em consideração 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? Caso contrário, existem alternativas?

Editar

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

Editar # 2

Aceitei a fpingsolução (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

Este comando leva no máximo 500ms para ser concluído e fornece o status de 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
MiniQuark
fonte

Respostas:

41

O fping pode ser uma ferramenta melhor que o ping de estoque que você está usando. Em qual SO você está?

  • "fping difere do ping, pois você pode especificar qualquer número de destinos na linha de comando ou especificar um arquivo contendo as listas de destinos a serem executados."
  • "Em vez de enviar para um alvo até atingir o tempo limite ou responder, o fping enviará um pacote de ping e passará para o próximo alvo de maneira alternada".
  • "Diferentemente do ping, o fping deve ser usado em scripts, portanto sua saída foi projetada para ser fácil de analisar."
AndyN
fonte
11
Funciona muito bem, obrigado, é isso que eu estava procurando. Este comando executa bem o trabalho: fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 ... A coisa toda dura meio segundo e eu obtenho os resultados de todos os hosts de uma só vez. Excelente ferramenta. :-))
MiniQuark
38

Para pessoas que procuram uma solução que envolva ping, use o -iswitch.

ping -i 0.2 www.google.com

Ou, se você quiser usar 0.1, precisará executá-lo como root

sudo ping -i 0.1 www.google.com

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

Victor Bjelkholm
fonte
4
+1 de mim. Este é o primeiro resultado ao pesquisar "tempo limite de ping" no Google e é exatamente isso que eu estava procurando.
Steven Jeffries
@StevenJeffries Mesmo aqui!
Luc
11
No caso de host morto, esta solução imprimirá sua primeira saída útil após cerca de 1 segundo. Esta é definitivamente uma resposta errada, como o @MarcelBurkhard já mencionou.
Victor Yarema
11
O problema com esta solução é que -i 0.1 NÃO esperará 100 ms, mas mais, por pings que demoram mais de 100 ms, diminuindo o tempo.
Llamageddon
2
Esta resposta está incorreta - não alterar o tempo que pingvai esperar por uma resposta - sim, apenas envia pings consecutivos mais rápido ....
Mtl Dev
21

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

timeout 0.2 ping -c1 fqdn || { do_work }
Jordon Bedwell
fonte
Boa resposta! Agora eu fiz: timeout 1 ping -c 1 test.com
vrijdenker
11
Minha versão do timeout aceita apenas 1 segundo. timeout (GNU coreutils) 8.4.
SLM
i como esta solução, que pode ser aplicado a todos os outros comandos
datdinhquoc
@ SLM, é estranho que sua versão não suporte menos de um segundo. Funciona para mim: DURATION is a floating point number with an optional suffix: 's' for seconds (the default),... Nos meus man timeoutrelatos de caso GNU coreutils 8.26. BWT, estou usando o Ubuntu 17.04.
Victor Yarema
Essa é realmente a única coisa que funciona se você deseja diminuir o tempo limite (o host não responde) ... Você precisa fazer as contas: o tempo limite deve ser maior que "-c" * "-i" do comando ping-
Marki
13

Eu estaria usando o nmap para esta 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.

ritmo
fonte
Boa chamada .. Esta é a maneira "Impressionante" de fazê-lo: D +1
Arenstar 10/11/10
Olá, Acabei de tentar isso, mas recebi a seguinte mensagem de erro: "--host-timeout é especificado em milissegundos, a menos que você o qualifique adicionando 's', 'm', 'h' ou 'd'. O valor deve ser maior que 1500 milissegundos ".
MiniQuark 11/11/10
Eu acho que o problema é óbvio, o tempo limite não pode ser menor que 1500ms. Do que você deve procurar as opções nmap em relação ao paralelismo, eu acho.
pacey
Isso parece enviar apenas uma solicitação. Estou procurando por detecção contínua de falhas, cheguei aqui no Google "ping milissegundo tempo limite", o nmap oferece infinie-pings como o ubuntu ping faz?
ThorSummoner
definir o tempo limite para algo menor do que um segundo irá envolver a utilização de um usuário privilegiado como em @ resposta victor-bjelkholm
thrau
4

você pode querer olhar para a ferramenta arp ping se todos os seus hosts estiverem na LAN física. Ele faz a mesma coisa, mas usa pacotes arp da camada 2 para fazer o 'ping'. Você pode usar uma combinação de arpping e ping icmp, ou de fato tcp ping, para reunir qual é a falha. Por exemplo, é um travamento da pilha tcp, embora seja raro hoje em dia, poderíamos descobrir se uma pilha tcp da máquina falhou, pois a máquina não responderia ao ping, mas responderia ao arp (que é um trecho de 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 travou, a pilha tcp travou ou a máquina travou completamente. Se você gerencia comutadores Ethernet, pode obter dados do link físico, revelando se a máquina está realmente ligada ou se foi desconectada fisicamente. Tivemos uma situação em que as máquinas (clientes em salas públicas) seriam desligadas, reunimos esses dados e a ativação de pacotes LAN para ativar as máquinas. :-)

Quaisquer que sejam as soluções criadas, se sua rede estiver ocupada, pense em implementar algum tipo de qo, para que seus pacotes de monitoramento tenham prioridade na rede, a perda de pacotes de medição devido ao congestionamento da rede pode gerar alarmes falsos. Se você usar qos para monitorar pacotes, 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. Nós achamos que até o sistema de monitoramento mais elementar é um passo na direção certa, pelo menos algum administrador está de olho nas máquinas :-).

boa sorte!

O zelador do Unix
fonte
3

@ Jordan-Bedwell tem uma ótima sugestão.

@ laszlo-valko https://stackoverflow.com/questions/20359487/why-does-ping-not-timeout-in-linux explica que os tempos limite do ping são iniciados somente 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 uns 20 segundos padrão antes de retornar falso.

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

Obrigado rapazes

Digc
fonte
2

Use a opção -w , tanto no Windows quanto no Debian.

É uma maneira rápida de verificar se a máquina responde, assumindo que ela responderá em 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
NXT
fonte
1

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

Paulo
fonte
0

Por que não iniciar o ping em segundo plano, com saída para um arquivo temporário, em paralelo para cada host? Depois durma por um segundo, interrompa todos os processos de ping que ainda estão em execução e leia os arquivos para coletar a saída.

dfranke
fonte
11
Acho que funcionaria, mas estava procurando uma solução mais simples. Obrigado mesmo assim.
MiniQuark 11/11
Este método não aumenta.
Synetech 07/07
0

O tempo limite é um valor inteiro indicando quanto tempo e quanto tempo o pacote pode ser enviado. Valores abaixo de 1 não têm sentido. Um valor 1 indica que você está executando ping apenas em vizinhos imediatos.

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

BillThor
fonte
2
Sinto muito, mas realmente não acho que isso seja verdade. A página do manual é bastante clara: -W especifica o "Tempo de espera por uma resposta, em segundos"; não é adimensional e, embora o ping não respeite valores abaixo de 1 (daí a questão), os tempos limites de segundo não são sem sentido. Se você me perdoa, pode estar confundindo -W com -t, este último configurando o campo IP TTL (contagem de saltos), que se comporta como você descreveu, e onde valores abaixo de 1 são realmente sem sentido.
MadHatter suporta Monica 11/11
-W é o tempo em que o processo de ping aguarda uma resposta e pode fazer sentido configurá-lo bem abaixo da contagem de saltos quando a contagem de saltos é alta, o que normalmente é. Em três segundos, você geralmente entra em condições de nova tentativa. Algumas ferramentas podem permitir o uso de um timer mais refinado para esperas, mas para a maioria dos usos de ping, os segundos são uma unidade razoável.
BillThor
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
VeggieVampire
fonte
Parece que nmapseria a ferramenta certa para o trabalho.
kasperd
0

tente isto:

ping -n 5 1.2.3.4.5 >nul
Micky
fonte
Como isso é melhor do que fping?
pintos
-1

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

ping -c 1 -t 1 -W 1 google.com
Ivelin
fonte