Verificar rapidamente se muitos hosts da rede estão funcionando e funcionando

2

Objetivo: verificar se um host está ativo e em funcionamento na rede,
com um método que pode ser eficientemente paralelizado em muitos hosts.

Ênfase em uma reviravolta rápida do cheque.

Razão para enfatizar a velocidade: várias verificações (às centenas) precisam ser realizadas em rápida sucessão e retornam resultados razoavelmente rápidos.

Método atual

O script atual usa um comando simples ping . A escolha não é obrigatória, pelo contrário, qualquer ferramenta adequada com igual ou melhor confiabilidade e velocidade pode ser usada como substituto.

Script atual

Algo ao longo destas linhas:

ping -c 1 -W 100 -q "$NETWORK_HOST" &> /dev/null

Deficiência óbvia desta abordagem: as respostas são necessárias com uma mudança de sub-segundo e isso pode esperar até um segundo, a partir da experiência.

Alternativa considerada

Esqueça a velocidade da execução sequencial, execute muitos comandos ping em paralelo usando o GNU parallel e agrupe os resultados no final. Isso foi experimentado, mas parece ainda pior na prática.

Intuição sobre uma solução melhor

Parece que ping may funciona muito bem como uma "verificação de integridade de pesquisa", tudo o que precisa ser ajustado é esperar muito pouco tempo e tempo limite em caso de não resposta.

Suposição: a rede é considerada confiável e RÁPIDA, os hosts não possuem necessariamente nenhuma das qualidades.

Pergunta

Como você resolveria isso? Quais ferramentas você usaria? É este o caminho certo? Você poderia fornecer um trecho de código?

  • Ambiente: hosts Ubuntu X OS
  • Script de script: Bash
  • É possível instalar software adicional, se necessário.
  • É possível compilar / instalar novo código para um aplicativo que não esteja no repositório e usá-lo.
por Robottinosino 27.09.2012 / 05:42

2 respostas

1

Desde que o ping seja bom o suficiente para você, fping é uma alternativa que funciona em paralelo imediatamente.

Esta é uma versão simplificada do que eu uso. Ele funciona com uma lista de hosts (um por linha) transmitidos por meio do pipe:

probe_hosts() {
    local report
    fping 2>/dev/null | while read report;
    do
        local host=${report/ is *}
        local state=${report/* is }
        if [ "$state" == "alive" ];
        then
            echo $host
        else
            echo unreachable: $host >&2
        fi
    done
}

# this is how you use it:
cat list_of_hosts \
    | probe_hosts \
    | do_something_with_live_hosts
    
por 21.05.2014 / 15:06
0

Você pode atribuir nmap a um intervalo:

$ nmap -sn 138.0.0.0/24
$ nmap -sn 138.0.0.0-255

A sinalização -sn significa apenas efetuar ping no host e retornar (ou seja, nenhuma varredura de porta como nmap normalmente faz).

Editar: Depois de ler os comentários, vejo que bahamat menciona arp . Na verdade, arp sem argumentos é executado mais rápido que nmap para mim e encontra tudo conectado à minha LAN:

$ time arp
real    0m0.411s
    
por 24.08.2014 / 15:21