Ping Linux: mostra il timeout


17

Come posso fare il ping di Linux per mostrare il timeout delle richieste invece di omettere l'output?

Proprio come la versione Windows del ping.


Come non mostrare il timeout?
Michael,

Risposte:


12

fping non ha funzionato per me ... Nel mio caso, la maggior parte delle volte voglio vedere che questo è fondamentalmente durante il riavvio del server ... funziona abbastanza bene su Windows ...

Costruisco un semplice script (espandendo la risposta @entropo) per aiutarmi su questo, che può aiutare a rispondere a questa domanda:

https://gist.github.com/brunobraga/7259197

#!/bin/bash

host=$1

if [ -z $host ]; then
    echo "Usage: `basename $0` [HOST]"
    exit 1
fi

while :; do
    result=`ping -W 1 -c 1 $host | grep 'bytes from '`
    if [ $? -gt 0 ]; then
        echo -e "`date +'%Y/%m/%d %H:%M:%S'` - host $host is \033[0;31mdown\033[0m"
    else
         echo -e "`date +'%Y/%m/%d %H:%M:%S'` - host $host is \033[0;32mok\033[0m -`echo $result | cut -d ':' -f 2`"
        sleep 1 # avoid ping rain
    fi
done

E l'uso è qualcosa del tipo:

inserisci qui la descrizione dell'immagine


Puoi modificarlo per segnalare la percentuale di perdita di pacchetti e contare su ogni riga?
Pol Hallen,

21

La cosa migliore che ho trovato è stato usare il flag -O (Nota che non funziona su tutte le distro - usando Linux Mint 17.1 Rebecca IPUTILS-PING 3: 20121221-4ubuntu1.1)

$ ping -O 10.10.5.1

64 bytes from 10.10.5.1: icmp_seq=53 ttl=245 time=460 ms
no answer yet for icmp_seq=54
64 bytes from 10.10.5.1: icmp_seq=55 ttl=245 time=265 ms
64 bytes from 10.10.5.1: icmp_seq=56 ttl=245 time=480 ms
no answer yet for icmp_seq=57
64 bytes from 10.10.5.1: icmp_seq=58 ttl=245 time=348 ms
64 bytes from 10.10.5.1: icmp_seq=59 ttl=245 time=515 ms
no answer yet for icmp_seq=60
64 bytes from 10.10.5.1: icmp_seq=61 ttl=245 time=320 ms
64 bytes from 10.10.5.1: icmp_seq=62 ttl=245 time=537 ms

Dalla pagina man:

-O Report outstanding ICMP ECHO reply before sending next packet. This is useful together with the timestamp -D to log output to a diagnostic file and search for missing answers.


Ciao scoy, benvenuto su Super User e grazie per la risposta a questa domanda! Questo sembra dipendere dalla versione di ping; su Debian Wheezy ottengo " ping: invalid option -- 'O'", ma su Jessie funziona come noti. Potresti voler aggiornare la tua risposta per includere queste informazioni. (Ho anche inviato una modifica suggerita per utilizzare il testo preformattato per l'output e le informazioni dalla manpage)
bertieb

5

Quando uso ping per vedere se un host è attivo negli script di shell, faccio qualcosa del genere:

ping -W 1 -c 1 $HOST 2>&1 > /dev/null || (echo -n "dead!"; false) && command-that-needs-host-to-be-up

Fondamentalmente, invia un ICMP che scade in un secondo senza output e utilizza il codice di uscita per bloccare ulteriori azioni.


2

Non c'è modo per il comune pingdi farlo. Se stai cercando di scrivere qualcosa, hai alcune opzioni:

ping -c 2 <ip>
RESULT=$?
echo $RESULT
1

Se il ping fallisce, $?sarà 1, se il ping ha esito positivo, $?sarà 0.

L'altra opzione è fpingche funziona in modo molto simile a Cisco ping:

$ fping 200.1.1.1
200.1.1.1 is unreachable
$ fping 192.168.1.1
192.168.1.1 is alive

2

Lo script sopra di bruno.braga funziona bene, tuttavia personalmente preferisco un alias usando in un profilo shell (come .bashrc) in modo che possa essere un caso d'uso quotidiano.

La mia soluzione di seguito calcola anche automaticamente il numero progressivo della richiesta ECHO:

alias pingt='__pingt() { s=0; while :; do s=$(($s+1)); result=$(ping $1 -c1 -W1 |/bin/grep from) && echo "$result, seq=$s" && sleep 1 || echo timeout; done }; __pingt $1'

Ecco l'esempio di output quando l'host è instabile con un timeout:

$ pingt 10.10.10.126
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.235 ms, seq=1
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.228 ms, seq=2
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.209 ms, seq=3
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.241 ms, seq=4
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.195 ms, seq=5
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.211 ms, seq=6
timeout
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.267 ms, seq=8
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.232 ms, seq=9
^C

Naturalmente, lo svantaggio è: nessuna statistica alla fine quando si preme CTRL-C. Se lo si desidera, sarebbe anche possibile calcolare min / avg / max mediante script shell, mdev è molto al di là dell'ambito.


1

Temo ma non esiste una soluzione al 100% a questo con un ping standard. Anche con ping -v per un output dettagliato il ping sarebbe silenzioso in caso di timeout. Potresti provare a usare:

ping -w 2 192.168.199.1
PING 192.168.199.1 (192.168.199.1) 56(84) bytes of data.

--- 192.168.199.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1007ms

Questo interromperà il ping dopo 2 secondi e quindi mostrerebbe il numero di pacchetti trasmessi e la perdita di pacchetti. Un'altra opzione sarebbe quella di usare mtr .


1
nomad@local:~$ fping -l -e 8.8.8.8

8.8.8.8 : [0], 92 bytes, 183 ms (183 avg, 0% loss)
8.8.8.8 : [1], 92 bytes, 61.4 ms (122 avg, 0% loss)
8.8.8.8 : [2], 92 bytes, 164 ms (136 avg, 0% loss)
8.8.8.8 : [3], 92 bytes, 163 ms (143 avg, 0% loss)
8.8.8.8 : [5], 92 bytes, 158 ms (146 avg, 16% loss)
8.8.8.8 : [6], 92 bytes, 122 ms (142 avg, 14% loss)
8.8.8.8 : [7], 92 bytes, 134 ms (141 avg, 12% loss)
8.8.8.8 : [8], 92 bytes, 130 ms (140 avg, 11% loss)

nomad@local:~$ fping -version
fping: Version 3.2
fping: comments to david@schweikert.ch

Si noti tuttavia che dopo l'esecuzione del fping per un paio di minuti i timeout sporadici non hanno alcun effetto sulla perdita stampata (1 pacchetto su 1000 è una perdita dello 0,1% e il fping continuerà a stampare lo 0%). Per non parlare del fatto che è di gran lunga più facile notare un "timeout della richiesta" piuttosto che prendere il tempo che il 18% si trasforma in 19% (per non parlare del fatto che devi ignorare il momento in cui il 18% si sposta di nuovo al 17%)
ndemou

fpingè buono e BTW -enon è necessario quando -lo -cviene aggiunto, potrebbe semplicemente usare fping -l 8.8.8.8, l'output è lo stesso.
Eric Wang,

0

Mi piace molto lo script di shell di Bruno. Ho aggiunto una riga per creare un file con tutti gli errori.

echo -e " date +'%Y/%m/%d %H:%M:%S'- host $ host è \ 033 [0; 31mdown \ 033 [0m" >> ./lostpackets.txt


0

Senza scrivere nulla

ping -f -i 1 hostname

Vantaggi : comando standard di Linux - niente da installare o script.

Svantaggi :

  1. NIENTE viene stampato per i pacchetti che ricevono risposta correttamente
  2. Emette un fastidioso segnale acustico per i pacchetti a cui viene risposto con successo
  3. L'indicazione visiva dei timeout è minima possibile (un piccolo punto rimane sullo schermo quando un pacchetto scade).

Con una sceneggiatura minima

#!/bin/bash
while :; do
    ping -W1 -c 1 "$@" | grep 'bytes from '
    case $? in
        0 ) sleep 1 ;;
        1 ) echo -e "request timeout" ;;
        * ) exit ;;
    esac
done

Svantaggi : non si ottengono statistiche alla fine e non è possibile utilizzare queste 3 opzioni di ping:

  1. -i per modificare l'intervallo tra l'invio di pacchetti (è hardcoded a 1sec)
  2. -W per modificare il timeout (è hardcoded a 1sec)
  3. -c per interrompere dopo l'invio di N pacchetti

A proposito: questo è uno degli esempi estremamente rari di funzionalità che mi manca davvero da uno strumento della CLI di Linux ma che trovo in uno strumento di Windows. L'esecuzione che dimostra la regola come si suol dire :-)


0

Se si desidera eseguire il ping continuo proprio come Windows e con il timestamp, utilizzare questo. Sentiti libero di sostituire 192.168.0.1con il tuo indirizzo IP

while :; do ping -c 1 -t 1 192.168.0.1 > /dev/null && echo "`date` >>> Reply OK" && sleep 1 || echo "`date` >>> Request timed out"; done

Esempio Rispondi OK

[user@Linux ~]$ while :; do ping -c 1 -t 1 192.168.0.1 > /dev/null && echo "`date` >>> Reply OK" && sleep 1 || echo "`date` >>> Request timed out"; done
Wed Jan  3 03:41:49 GMT 2018 >>> Reply OK
Wed Jan  3 03:41:50 GMT 2018 >>> Reply OK
Wed Jan  3 03:41:51 GMT 2018 >>> Reply OK
^Z
[23]+  Stopped                 sleep 1
[user@Linux ~]$

Esempio di richiesta scaduto

[user@Linux ~]$ while :; do ping -c 1 -t 1 192.168.0.254 > /dev/null && echo "`date` >>> Reply OK" && sleep 1 || echo "`date` >>> Request timed out"; done
Wed Jan  3 03:41:36 GMT 2018 >>> Request timed out
Wed Jan  3 03:41:37 GMT 2018 >>> Request timed out
Wed Jan  3 03:41:38 GMT 2018 >>> Request timed out
^Z
[22]+  Stopped                 ping -c 1 -t 1 192.168.0.254 >/dev/null
[user@Linux ~]$ 

0

Il ping normale effettivamente mostra timeout. Osservando il valore seq = tra i ping è possibile sapere quanti timeout

64 bytes from 192.168.12.46: icmp_seq=8 ttl=62 time=46.7 ms
64 bytes from 192.168.12.46: icmp_seq=11 ttl=62 time=45.3 ms

I timeout di EG 3 si sono verificati tra i 2 ping precedenti poiché il primo era seq=8e il secondo era seq=11 (9 e 10 erano timeout) seq=sequence.

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.