Modo più veloce del ping per verificare se il computer è online?


20

Sto scrivendo un wake on lan script per un set dei nostri computer da laboratorio. Abbiamo sqlite db con un elenco di nomi host, IP e MAC del computer e attualmente eseguo il ping di ciascuno di essi con '-c1' in modo che non funzioni all'infinito - ma anche questo richiede un po 'di attesa, c'è un modo più veloce per ottenere rispondere piuttosto che eseguire il ping? L'uso del ping sembra rallentare un po 'lo script poiché ha bisogno delle risposte ping per continuare.

Grazie mille per eventuali suggerimenti!

Risposte:


20

L'invio di un singolo pacchetto e l'attesa di una risposta sarà uno dei modi più veloci possibili e il ping è un ottimo modo per farlo. In effetti, a seconda del tuo caso d'uso, direi che è troppo veloce , dal momento che non ti dice davvero se il sistema sta effettivamente facendo qualcosa di utile, solo che il sottosistema di rete del kernel è attivo e configurato.

Ma supponendo che sia abbastanza buono, puoi apportare alcuni miglioramenti. Innanzitutto, è possibile utilizzare -W1per ridurre il timeout del ping a un secondo. In secondo luogo, è possibile fare in modo che lo script esegua il ping dei diversi host in modo asincrono (in un thread in background) e controllare i risultati secondo necessità anziché attendere.

In alternativa, puoi ripensare l'approccio e fare in modo che i sistemi remoti eseguano il check-in in qualche modo quando sono attivi e, se un sistema non ha effettuato il check-in, puoi supporre che sia inattivo.


Una buona chiamata sull'aggiunta -w, ha dovuto fare due anche se un gruppo di computer non ha risposto abbastanza velocemente. Potresti cercare di aggiungere una sorta di check-in periodico o di stringere la mano, ma per ora voglio avere il processo relativamente esterno ai computer che sto accendendo.
Jon Phenow,

1
Uso anche -s per inviare un pacchetto più piccolo.
Shawn J. Goff,

3
Sarò scioccato se l'invio di un pacchetto più piccolo fa la differenza.
Mattdm,

Non sono praticamente già inviati a pacchetti di dimensioni quasi minime?
Jon Phenow,

4
Sono piuttosto piccoli; c'è un valore predefinito di 56 byte di dati, che è possibile ridurre. Ma in ogni caso, è più piccolo della MTU Ethernet e più grande di niente, quindi si riduce a "un pacchetto" in entrambi i casi.
Mattdm,

7

Questo è ciò per cui il fping è stato progettato. http://fping.sourceforge.net/

Successivamente devi analizzare l'output invece di fare affidamento su un codice di ritorno, ma è molto più veloce del normale ping.


Penso che sia abbastanza divertente la descrizione dice "A differenza del ping, il fping è pensato per essere usato negli script e il suo output è facile da analizzare." e tuttavia non fornisce un codice di ritorno
Adam Plocher,

Quali sarebbero i buoni valori per il codice di ritorno?
Thorbjørn Ravn Andersen,

3

Funzionerebbe solo per uno o due computer, ma se li colleghi direttamente al computer responsabile della verifica del loro stato, puoi utilizzare ethtoolper vedere se il collegamento è attivo o meno.


Non ho usato ethtool per questo, ti piacerebbe fare un esempio? (o forse un link)?
Johan,

ethtool {network_interface} | grep "Link detected" | cut -f 3 -d ' 'ritornerà yesse una macchina è connessa e nose non lo è.
LawrenceC,

2

Quello che potresti fare è il ping dell'indirizzo di trasmissione che dovrebbe causare il ping di tutti i computer. Quindi è possibile eseguire un controllo incrociato di questo elenco con quello che si ha in SQLite per assicurarsi che tutti i computer siano attivi.

A parte questo, un ping è probabilmente il modo più veloce per garantire che un computer sia attivo su una rete. Come indicato dall'altra risposta, questo non fornisce dati veramente utili. Se hai la possibilità di installare script puoi aggiungere un cronjob per eseguire il ping di un server centrale, eseguire un'attività o semplicemente echo fuori dall'elenco dei processi su un server centrale che registrerà la richiesta. Quindi semplicemente controllando che ti dirà se hai problemi senza la necessità di controllare manualmente ogni volta.


1
Suppongo che intendi eseguire il ping dell'indirizzo di trasmissione, non del gateway. Sui sistemi moderni, probabilmente non funzionerà. Vedi unix.stackexchange.com/questions/7458/cant-ping-broadcast
mattdm

1
@mattdm: Multicast allora? Non sapevo che la maggior parte delle persone lo disattivasse. Non ho riscontrato problemi con esso prima.
Josh K,

Haha sì grazie Mattdm, un problema simile che puoi vedere mi sono imbattuto. non è che le persone li spegnano, ma generalmente arrivano con la trasmissione ultimamente apparentemente.
Jon Phenow,

Potrebbe usare fping ( fping.sourceforge.net ) per eseguire il ping di un elenco di host in parallelo. Quindi non devi fare affidamento sulla possibilità di eseguire il ping dell'indirizzo di trasmissione.
mazianni,

2

Ganglia utilizza il traffico multicast per monitorare molti host in un cluster, forse potresti usare qualcosa di simile? Ciò presuppone che l'hardware di rete consenta il traffico multicast tra tutti gli host e il sistema di monitoraggio.


1
Sembra uno strumento interessante, ma ai fini di questo piccolo script potrebbe aggiungere un po 'di pezzi inutili al progetto, mantenendolo come uno script piuttosto piccolo per ora. Sicuramente lo terrò d'occhio, sembra uno strumento che potrei usare presto comunque.
Jon Phenow,

0

Ho avuto lo stesso problema e mi è venuta in mente la seguente sceneggiatura (veloce e sporca). Ciò emette essenzialmente tutti i ping come lavori separati in parallelo e scansionerà un'intera sottorete / 24 in 3 secondi; nota che per qualche motivo non mi sono preoccupato di scoprire che non potevo usare qui il codice del risultato del ping ma grep -v ha fatto il lavoro:

#!/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

0

In 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 */

0

Ho trovato fping -r0 ...per fornire la risposta più veloce.

L' -ropzione (riprova) sembra più veloce di quella simile -c(conteggio). L'uso dei -r0risultati comporta l'invio di un solo ping e l'output è molto abbreviato rispetto ad altre opzioni.

Sul mio sistema ...

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

Risultati in ...

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

Un piccolo massaggio per liberarmi del ICMPmessaggio mi 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

Per quanto riguarda la velocità, fpingsu questo vecchio Intel Dual-Core da 1,8 GHz con 4 GB di 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 l' grepe sortsembrano solo aggiungere 0.001-0.004s al 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

APPUNTI

  • Il ICMPmessaggio non viene visualizzato ad ogni esecuzione.
  • Il 2>&1è necessario per evitare che il ICMPmessaggio da mostrare nell'output come è stato inviato al stderrposto di stdout.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.