Risposte:
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:
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.
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)
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.
Non c'è modo per il comune ping
di 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 è fping
che 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
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.
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 .
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
fping
è buono e BTW -e
non è necessario quando -l
o -c
viene aggiunto, potrebbe semplicemente usare fping -l 8.8.8.8
, l'output è lo stesso.
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
Senza scrivere nulla
ping -f -i 1 hostname
Vantaggi : comando standard di Linux - niente da installare o script.
Svantaggi :
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:
-i
per modificare l'intervallo tra l'invio di pacchetti (è hardcoded a 1sec)-W
per modificare il timeout (è hardcoded a 1sec)-c
per interrompere dopo l'invio di N pacchettiA 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 :-)
Se si desidera eseguire il ping continuo proprio come Windows e con il timestamp, utilizzare questo. Sentiti libero di sostituire 192.168.0.1
con 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 ~]$
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=8
e il secondo era seq=11
(9 e 10 erano timeout)
seq=sequence
.