Come posso impostare un timeout breve con il comando ping?


49

Sto cercando di scrivere uno script che elenca tutti gli host sulla mia LAN (ce ne sono circa 20) e scrive lo stato del ping accanto a ciascun host. Ho il file di leasing DHCP, quindi ho tutti gli IP (diciamo 10.0.0.1, 10.0.0.2, ecc.), Tutto ciò di cui ho bisogno è lo stato del ping per ogni host.

Quindi, il mio script avvia un singolo ping per ciascun host:

ping -c 1 10.0.0.1

Sfortunatamente, quando un host è offline, il ping impiega molto tempo per il timeout. Ho controllato man ping, sembrano esserci due opzioni per impostare il ritardo di timeout: -w deadlinee -W timeout. Penso di essere interessato a quest'ultimo.

Quindi ho provato questo:

ping -c 1 -W 1 10.0.0.1

Ma aspettare un secondo per host offline è ancora troppo lungo. Ho provato a impostarlo al di sotto di un secondo, ma non sembra affatto prendere in considerazione il parametro:

ping -c 1 -W 0.1 10.0.0.1  # timeout option is ignored, apparently

C'è un modo per impostare il timeout su un valore inferiore? In caso contrario, ci sono alternative?

modificare

  • Il sistema operativo è Debian Lenny.
  • Gli host che sto cercando di eseguire il ping sono in realtà punti di accesso. Sono sulla stessa rete virtuale e sottorete degli utenti (per semplicità di distribuzione e sostituzione). Questo è il motivo per cui non voglio scansionare tutta la sottorete (con un ping -besempio).

Modifica n. 2

Ho accettato la fpingsoluzione (grazie per tutte le altre risposte). Questo comando fa esattamente quello che stavo cercando:

fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4

Il completamento di questo comando richiede al massimo 500 ms e mi dà lo stato di ping di tutti gli host contemporaneamente:

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

Su Debian Lenny, l'installazione è banale:

aptitude update
aptitude install fping

Risposte:


41

fping potrebbe essere uno strumento migliore rispetto al ping stock che si sta utilizzando. Su quale sistema operativo sei?

  • "il fping differisce dal ping in quanto è possibile specificare un numero qualsiasi di target sulla riga di comando oppure specificare un file contenente gli elenchi di target da eseguire il ping."
  • "Invece di inviare a un bersaglio fino a quando non scade o risponde, il fping invierà un pacchetto ping e passerà al bersaglio successivo in modo round robin."
  • "A differenza del ping, il fping è pensato per essere utilizzato negli script, quindi il suo output è progettato per essere facile da analizzare."

1
Funziona benissimo, grazie, questo è quello che stavo cercando. Questo comando fa bene il lavoro: fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 ... L'intero processo dura mezzo secondo e ottengo i risultati per tutti gli host contemporaneamente. Strumento eccellente. :-))
MiniQuark

38

Per le persone alla ricerca di una soluzione che implichi ping, utilizzare l' -iinterruttore.

ping -i 0.2 www.google.com

Oppure, se si desidera utilizzare 0.1, è necessario eseguirlo come root

sudo ping -i 0.1 www.google.com

Non è necessario scaricare utility extra.


4
+1 da me. Questo è il primo risultato quando si cerca su Google il "timeout del ping", ed è esattamente quello che stavo cercando.
Steven Jeffries,

@StevenJeffries Lo stesso qui!
Luc,

1
In caso di host morto questa soluzione stamperà il suo primo output utile dopo circa 1 secondo. Questa è sicuramente una risposta sbagliata come già menzionato @MarcelBurkhard.
Victor Yarema,

1
Il problema con questa soluzione è che -i 0,1 NON aspetterà 100 ms, ma più a lungo, per ping che richiedono più di 100 ms, gettando così il tempo.
Llamageddon

2
Questa risposta non è corretta - non cambia il tempo di pingattesa per una risposta - piuttosto invia solo ping consecutivi più velocemente ....
Mtl Dev

21

È possibile impostare un breve timeout con il timeoutcomando su Ubuntu / Debian:

timeout 0.2 ping -c1 fqdn || { do_work }

Buona risposta! Ora ho fatto: timeout 1 ping -c 1 test.com
vrijdenker

1
La mia versione di timeout accetta solo 1 secondo. timeout (GNU coreutils) 8.4.
slm,

mi piace questa soluzione, può essere applicata a tutti gli altri comandi
datdinhquoc

@slm, è strano che la tua versione non supporti meno di un secondo. Funziona per me: DURATION is a floating point number with an optional suffix: 's' for seconds (the default),... nei miei casi man timeoutclinici GNU coreutils 8.26. BWT, sto usando Ubuntu 17.04.
Victor Yarema,

Questa è in realtà l'unica cosa che funziona se vuoi ridurre i timeout (l'host non risponde) ... Devi però fare i calcoli: il timeout deve essere maggiore di "-c" * "-i" del comando ping-
Marki

13

Userei nmap per questo compito.

nmap -sP --max-retries=1 --host-timeout=1500ms 10.0.0.1

Vedi la documentazione nmap per maggiori dettagli al riguardo.


Buona chiamata .. Questo è il modo "fantastico" per farlo: D +1
Arenstar,

Ciao, ho appena provato questo, ma ho ricevuto il seguente messaggio di errore: "--host-timeout è specificato in millisecondi, a meno che tu non lo qualifichi aggiungendo 's', 'm', 'h' o 'd'. Il valore deve essere maggiore di 1500 millisecondi ".
MiniQuark,

Penso che il problema sia ovvio, il timeout non può essere inferiore a 1500ms. Quindi dovresti cercare le opzioni nmap relative al parallelismo, penso.
pacey

Questo sembra inviare solo una richiesta. Sto cercando il rilevamento continuo dei guasti, sono arrivato qui googling "ping millisecondo timeout", nmap offre infiniti ping come Ubuntu Ping fa?
ThorSummoner,

l'impostazione del timeout a un valore inferiore a un secondo implica l'utilizzo di un utente privilegiato come nella risposta @ victor-bjelkholm
thrau,

4

potresti voler guardare lo strumento ping di arp se tutti i tuoi host sono sulla LAN fisica. Fa la stessa cosa ma usa i pacchetti arp di livello 2 per fare il 'ping'. È possibile utilizzare una combinazione di ping arpping e icmp, o in effetti tcp ping, per raccogliere l'errore. L'esempio è un arresto anomalo dello stack tcp, sebbene oggigiorno sia raro che si possa verificare se uno stack tcp della macchina si è arrestato in modo anomalo, poiché la macchina non rispondeva al ping, tuttavia rispondeva ad arp (che è un diverso pezzo di codice sull'host) .

usando una combinazione di arpping, tcpping e icmp ping puoi scoprire se il servizio sulla macchina è andato in crash, lo stack tcp si è bloccato o la macchina si è bloccata completamente. Se hai gestito switch Ethernet puoi ottenere dati di collegamento fisici, rivelando se la macchina è effettivamente accesa o era stata scollegata fisicamente. Abbiamo avuto una situazione in cui le macchine (clienti nelle sale pubbliche) sarebbero state spente, abbiamo raccolto quei dati e la sveglia inviata sui pacchetti lan, per accendere le macchine. :-)

Qualunque sia la soluzione che costruisci, se la tua rete è occupata, pensa a implementare un qualche tipo di qos, in modo che i tuoi pacchetti di monitoraggio abbiano la priorità sulla rete, perdendo i pacchetti di misurazione a causa della congestione della rete può dare falsi allarmi. Se usi qos per monitorare i pacchetti, dovrai pensare a raccogliere dati sull'utilizzo della rete.

Quindi, puoi rendere la tua soluzione di monitoraggio complessa o semplice come desideri. Troviamo che anche il sistema di monitoraggio più elementare sia un passo nella giusta direzione, almeno qualche amministratore sta tenendo d'occhio le macchine :-).

in bocca al lupo!


3

@ jordon-bedwell ha un grande suggerimento.

@ laszlo-valko https://stackoverflow.com/questions/20359487/why-does-ping-not-timeout-in-linux spiega che i timeout del ping iniziano solo dopo aver determinato l'indirizzo IP. Se si utilizza un DNS e la workstation non è in linea, il ping non è in grado di determinare l'indirizzo IP e quindi sembra attendere circa 20 + secondi predefiniti prima di restituire false.

L'uso dello strumento "timeout" di Linux fornisce un maggiore controllo quando si esegue il ping con un nome di dominio.

Grazie ragazzi


2

Usa l' opzione -w , sia su Windows che su Debian.

È un modo rapido per verificare se la macchina risponde affatto, supponendo che risponderà in tempo meno della quantità di secondi specificata.

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

1

Se riesci a scansionare la tua sottorete (o parte di essa) senza attivare allarmi di sicurezza e non ti preoccupare di un po 'di dati extra, Angry IP Scanner è veloce, gratuito, ti consente di fare clic per ordinare in base allo stato e può fornire informazioni più dettagliate .


0

Perché non avviare il ping in background, con l'output in un file temporaneo, in parallelo per ogni host? Quindi sospendi per un secondo, elimina tutti i processi ping ancora in esecuzione e leggi i file per raccogliere l'output.


1
Immagino che avrebbe funzionato, ma stavo cercando una soluzione più semplice. Grazie comunque.
MiniQuark,

Questo metodo non si ingrandisce.
Synetech,

0

Il timeout è un valore intero che indica la durata e la durata dell'invio del pacchetto. I valori inferiori a 1 sono privi di significato. Il valore 1 indica che stai eseguendo il ping solo dei vicini immediati.

L'unico modo per accelerare le cose è eseguire un controllo in background e raccogliere i risultati. Questo è ciò che fanno strumenti come Nagios.


2
Mi dispiace, ma non credo proprio che sia vero. La pagina man è abbastanza chiara che -W specifica il "Tempo di attesa per una risposta, in secondi"; non è privo di dimensioni e sebbene il ping non rispetti valori inferiori a 1 (da cui la domanda) i timeout sub-secondi non sono privi di significato. Se mi perdonerai, potresti confondere -W con -t, quest'ultimo che imposta il campo IP TTL (conteggio hop), che si comporta come hai descritto e dove i valori inferiori a 1 sono effettivamente insignificanti.
MadHatter supporta Monica l'

-W è la volta in cui il processo di ping attende una risposta, e può avere senso impostarlo ben al di sotto del conteggio dei luppoli quando il conteggio dei luppoli è elevato, che normalmente è. Di solito, entro tre secondi ci si ritrova. Alcuni strumenti possono consentire l'uso di un timer più preciso per le attese, ma per la maggior parte degli usi del ping, i secondi sono un'unità ragionevole.
BillThor,

0

Potresti provare qualcosa del genere. Ma ci vogliono 15 minuti per correre.

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

Sembra che nmapsarebbe lo strumento giusto per il lavoro.
Kasperd,


-1

ping ha le opzioni [-t timeout] e [-W waittime] in modo da poter fare:

ping -c 1 -t 1 -W 1 google.com
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.