De maneira mais rápida do que o ping para checar se o computador está online?

19

Estou escrevendo um alerta em um script de lan para um conjunto de nossos computadores de laboratório. Temos sqlite db com uma lista de hostnames de computador, IPs e MACs e atualmente eu pingar cada um deles com '-c1' para que ele não seja executado indefinidamente - mas mesmo isso leva um pouco de espera, existe uma maneira mais rápida de obter responder em vez de pingar? Usar o ping parece retardar o script, já que ele precisa das respostas do ping para continuar.

Muito obrigado por qualquer sugestão!

    
por jphenow 17.02.2011 / 16:15

7 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 , já que ele não diz realmente se o sistema está realmente fazendo algo útil, apenas que o subsistema de rede do kernel está vivo e configurado.

Mas supondo que isso seja bom o suficiente, você pode fazer algumas melhorias. Primeiro, você pode usar -W1 para diminuir o tempo limite do ping para um segundo. Segundo, você poderia fazer com que o seu script pingasse os diferentes hosts de forma assíncrona (em um thread de 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 ativos e, se um sistema não tiver feito o check-in, você pode supor que está inativo.

    
por 17.02.2011 / 16:23
7

É para isso que o fping foi projetado. link

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

    
por 18.02.2011 / 07:18
3

Isso funcionaria apenas para um ou dois computadores, mas se você conectá-los diretamente ao computador responsável pela verificação do status deles, você poderá usar ethtool para ver se o link está ativo ou não.

    
por 17.02.2011 / 19:20
2

O que você pode fazer é pingar o endereço de broadcast, o que deve fazer com que todos os computadores façam o ping. Então você pode checar essa lista com o que você tem no SQLite para garantir que todos os computadores estejam ativos.

Outras, então, que um ping é provavelmente o modo mais rápido de garantir que um computador esteja ativo em uma rede. Como mencionado pela 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 simplesmente fazer o eco da lista de processos para um servidor central que registrará a solicitação. Em seguida, basta verificar se há algum problema sem precisar verificar manualmente todas as vezes.

    
por 17.02.2011 / 16:20
2

O Ganglia usa o 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 o tráfego multicast entre todos os hosts e seu sistema de monitoramento.

    
por 17.02.2011 / 16:34
0

Eu tive o mesmo problema e criei o seguinte script (rápido e sujo). Isto esentially emite todos os pings como trabalhos separados em paralelo e varrerá uma sub-rede inteira / 24 em 3 segundos; note que por algum motivo eu não me preocupei em descobrir que eu não poderia usar o código de resultado ping aqui, mas 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
    
por 24.01.2013 / 13:47
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 */
    
por 14.03.2013 / 13:06