Maneira mais rápida que o ping para verificar se o computador está online?

20

Estou escrevendo um script wake on lan para um conjunto de nossos computadores de laboratório. Temos o sqlite db com uma lista dos nomes de host, IPs e MACs do computador, e atualmente eu sigo cada um deles com '-c1' para que não funcione infinitamente - mas mesmo que isso leve alguma espera, existe uma maneira mais rápida de obter responder em vez de ping? O uso do ping parece diminuir bastante o script, pois ele precisa das respostas para continuar.

Muito obrigado por todas as sugestões!

Jon Phenow
fonte

Respostas:

20

Enviar um único pacote e aguardar uma resposta será uma das maneiras mais rápidas possíveis, e o ping é uma ótima maneira de fazer isso. De fato, dependendo do seu caso de uso, eu diria que é muito rápido , uma vez que não informa se o sistema está realmente fazendo algo útil, apenas que o subsistema de rede do kernel está ativo e configurado.

Mas, supondo que isso seja bom o suficiente, você pode fazer algumas melhorias. Primeiro, você pode usar -W1para diminuir o tempo limite do ping para um segundo. Segundo, você pode fazer seu script executar ping nos diferentes hosts de forma assíncrona (em um encadeamento em segundo plano) e verificar os resultados conforme necessário, em vez de esperar.

Como alternativa, você pode repensar a abordagem e fazer com que os sistemas remotos façam o check-in de alguma forma quando estiverem ativados e, se um sistema não tiver feito o check-in, você pode assumir que está inoperante.

mattdm
fonte
Uma boa ligação para a adição -w teve que ser duas, apesar de vários computadores não responderem rápido o suficiente. É possível adicionar algum tipo de check-in periódico ou apertar a mão, mas por enquanto quero ter o processo relativamente externo aos computadores que estou ligando.
Jon Phenow
1
Eu também uso -s para enviar um pacote menor.
Shawn J. Goff
3
Ficarei chocado se o envio de um pacote menor fizer diferença.
mattdm
Eles já não são enviados quase com tamanho mínimo de pacotes?
Jon Phenow
4
Eles são bem pequenos; há um padrão de 56 bytes de dados, que você pode reduzir. Mas, em qualquer caso, é menor que o MTU ethernet e maior que nada, então se resume a "um pacote" de qualquer maneira.
mattdm
7

É para isso que o fping foi projetado. http://fping.sourceforge.net/

Você precisa analisar a saída posteriormente, em vez de confiar em um código de retorno, mas é muito mais rápido do que executar ping normal.

Thorbjørn Ravn Andersen
fonte
Eu acho que é meio engraçado a descrição diz "Ao contrário do ping, o fping é para ser usado em scripts e sua saída é fácil de analisar". e ainda assim ele não fornece um código de retorno
Adam Plocher
Quais seriam os bons valores para o código de retorno?
Thorbjørn Ravn Andersen
3

Isso funcionaria apenas para um ou dois computadores, mas se você os conectar diretamente ao computador responsável por verificar seu status, poderá usar ethtoolpara verificar se o link está ativo ou não.

LawrenceC
fonte
Eu não usei o ethtool para isso, gostaria de dar um exemplo? (ou talvez um link)?
Johan
ethtool {network_interface} | grep "Link detected" | cut -f 3 -d ' 'retornará yesse uma máquina estiver conectada e nose não estiver.
LawrenceC
2

O que você pode fazer é executar ping no endereço de broadcast, o que deve fazer com que todos os computadores retornem. Em seguida, você pode cruzar esta lista com o que você possui no SQLite para garantir que todos os computadores estejam funcionando.

Além disso, um ping é provavelmente a maneira mais rápida de garantir que um computador esteja ativo em uma rede. Como mencionado na outra resposta, isso não fornece dados realmente úteis. Se você tiver a capacidade de instalar scripts, poderá adicionar um cronjob para executar ping em um servidor central, executar uma tarefa ou apenas fazer eco da lista de processos em um servidor central que registrará a solicitação. Em seguida, basta verificar se você tem algum problema sem precisar verificar manualmente todas as vezes.

Josh K
fonte
1
Eu suponho que você quer dizer ping o endereço de broadcast, não o gateway. Nos sistemas modernos, isso provavelmente não funcionará. Veja unix.stackexchange.com/questions/7458/cant-ping-broadcast
mattdm
1
@mattdm: Multicast então? Eu não sabia que a maioria das pessoas desligou. Eu nunca tive problemas com isso antes.
21711 Josh K
Haha sim, obrigado mattdm, um problema semelhante que você pode ver, eu me deparei. não é que as pessoas as desliguem, mas elas geralmente vêm com transmissão ultimamente, aparentemente.
Jon Phenow
Pode usar fping ( fping.sourceforge.net ) para executar ping em uma lista de hosts em paralelo. Então você não precisa confiar em poder executar ping no endereço de transmissão.
17231 mazianni
2

O Ganglia usa tráfego multicast para monitorar muitos hosts em um cluster; talvez você possa usar algo semelhante? Isso pressupõe que seu hardware de rede permita tráfego multicast entre todos os hosts e seu sistema de monitoramento.

jsbillings
fonte
1
Parece uma ferramenta interessante, mas para os propósitos deste pequeno script pode adicionar um pedaço desnecessário ao projeto, mantendo-o como um script bem pequeno por enquanto. Definitivamente vou ficar de olho nisso, parece uma ferramenta que eu poderia usar em breve, não menos que isso.
Jon Phenow
0

Eu tive o mesmo problema e criei o seguinte script (rápido e sujo). Isso emite essencialmente todos os pings como trabalhos separados em paralelo e varrerá uma sub-rede inteira / 24 em 3 segundos; note que, por algum motivo, não me dei ao trabalho de descobrir que não podia usar o código de resultado do ping aqui, mas o grep -v fez o trabalho:

#!/bin/bash
case $# in
1)
  case $1 in
  [1-9]*)
        echo
        echo Systems active in subnet: $1
        for (( K = 1 ; K < 255 ; K=$K+1 )); do
        # grep -v delivers 0 on no matches
                echo -ne "testing:" $1$K "...    \r"
                (if ping -c 1 -w 1 -n $1$K 2>&1 | grep -q '64 bytes' ; then
                echo $1$K alive "                "
                fi) &
        done
        sleep 3
        echo "                               "
        exit 0
        ;;
  esac;;
esac
Par
fonte
0

Em C,

/* count = 1, wait interval = 1 second, no name lookup, */
/* 10 data bytes, 1 second timeout, 200 millisecond wait time */

sprintf(command,"ping -c1 -i1 -n -s10 -t1 -W200 %u" 
   , connection[port].IPAddress);
err = system(command);
/* err == 0 means OK */
Joe
fonte
0

Eu descobri fping -r0 ...para fornecer a resposta mais rápida.

A -ropção (repetição) parece mais rápida que a similar -c(contagem). O uso de -r0resultados em apenas um ping sendo enviado e a saída é muito abreviada em comparação com outras opções.

No meu sistema ...

fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01  2>&1

Resulta em...

LX00 is alive
LX02 is alive
HA01 is alive
ICMP Host Unreachable from 192.168.1.5 for ICMP Echo sent to LX01
PRINTER is unreachable
LX01 is unreachable
LX03 is unreachable

Um pouco de massagem para me livrar da ICMP(s) mensagem (s) me dá ...

fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01  2>&1 | grep ' is ' | sort

HA01 is alive
LX00 is alive
LX01 is unreachable
LX02 is alive
LX03 is unreachable
PRINTER is unreachable

Quanto à velocidade, o fpingantigo Intel Dual-Core de 1,8 GHz com 4 GB de RAM é ...

time fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01 2>&1

LX00 is alive
LX02 is alive
HA01 is alive
PRINTER is unreachable
LX01 is unreachable
LX03 is unreachable

real    0m0.554s
user    0m0.000s
sys     0m0.000s

E o grepe sortparece adicionar apenas 0.001-0.004s ao tempo ...

time fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01 2>&1 | grep ' is ' | sort

HA01 is alive
LX00 is alive
LX01 is unreachable
LX02 is alive
LX03 is unreachable
PRINTER is unreachable

real    0m0.558s
user    0m0.000s
sys     0m0.000s

NOTAS

  • A ICMPmensagem não ocorre em todas as execuções.
  • O 2>&1é necessário para evitar a ICMPmensagem de aparecendo na saída como ele é enviado para stderrem vez de stdout.
DocSalvager
fonte