Respuestas:
fping no me funcionó ... En mi caso, la mayoría del tiempo que quiero ver esto es básicamente durante el reinicio del servidor ... esto funciona bastante bien en Windows ...
Construyo un script simple (expandiendo la respuesta de @entropo) para ayudarme en eso, lo que puede ayudar a responder esta pregunta:
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
Y el uso es algo como:
Lo mejor que encontré fue usar el indicador -O (tenga en cuenta que no funciona en todas las distribuciones, 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
De la página del manual:
-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
; en Debian Wheezy me sale " ping: invalid option -- 'O'
", pero en Jessie funciona como lo anotó. Tal vez desee actualizar su respuesta para incluir esta información. (También he enviado una edición sugerida para usar texto preformateado para la salida y la información de la página del manual)
Cuando uso ping para ver si un host está arriba en los scripts de shell, hago algo como esto:
ping -W 1 -c 1 $HOST 2>&1 > /dev/null || (echo -n "dead!"; false) && command-that-needs-host-to-be-up
Básicamente, envía un ICMP que se agota en un segundo sin salida y usa el código de salida para bloquear la acción.
No hay camino para lo común. ping
Para hacer eso. Si está intentando escribir algo, tiene algunas opciones:
ping -c 2 <ip>
RESULT=$?
echo $RESULT
1
Si el ping falla, $?
será 1, si el ping es exitoso, $?
será 0.
La otra opción es usar fping
Eso funciona mucho como Cisco ping
:
$ fping 200.1.1.1
200.1.1.1 is unreachable
$ fping 192.168.1.1
192.168.1.1 is alive
El script anterior de bruno.braga funciona bien, sin embargo, personalmente prefiero usar un alias en un perfil de shell (como .bashrc) para que pueda ser un caso de uso diario.
Mi solución a continuación también calcula automáticamente el número de secuencia de solicitud de 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'
Aquí está el ejemplo de salida cuando el host es inestable con un tiempo de espera:
$ 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
Por supuesto, el inconveniente es que no hay estadísticas al final cuando se presiona CTRL-C. Si lo desea, también sería posible calcular min / avg / max mediante shell script, mdev está muy lejos del alcance.
Tengo miedo pero no hay una solución al 100% con el ping estándar. Incluso con ping -v para una salida detallada, el ping sería silencioso en caso de tiempos de espera. Podrías intentar usar:
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
Esto dejaría de hacer ping después de 2 segundos y luego mostraría la cantidad de paquetes transmitidos y la pérdida de paquetes. Otra opción sería utilizar 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
es bueno, y por cierto el -e
no es necesario cuando -l
o -c
se agrega, solo se puede usar fping -l 8.8.8.8
, la salida es la misma.
Me gusta mucho el script de shell de Bruno. Agregué una línea para crear un archivo con todos los fallos.
eco -e " date +'%Y/%m/%d %H:%M:%S'
- host $ host es \ 033 [0; 31mdown \ 033 [0m "& gt; & gt; ./lostpackets.txt
Sin scripting nada
ping -f -i 1 hostname
Ventajas : comando estándar de Linux - no hay que instalar ni script.
Desventajas :
Con un guión mínimo.
#!/bin/bash
while :; do
ping -W1 -c 1 "$@" | grep 'bytes from '
case $? in
0 ) sleep 1 ;;
1 ) echo -e "request timeout" ;;
* ) exit ;;
esac
done
Desventajas : No obtienes estadísticas al final y no puedes usar estas 3 opciones de ping:
-i
para alterar el intervalo entre el envío de paquetes (está codificado a 1 seg) -W
para alterar el tiempo de espera (está codificado a 1 seg) -c
parar después de enviar paquetes N Por cierto: este es uno de los ejemplos extremadamente raros de funcionalidad que realmente extraño en una herramienta CLI de Linux, pero que encuentro en una herramienta de Windows. La exección que prueba la regla como dicen :-)
Si desea realizar un ping continuo como Windows y con marca de tiempo, utilice este.
Siéntase libre de reemplazar 192.168.0.1
con su propia dirección 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
Ejemplo de respuesta 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 ~]$
Ejemplo de solicitud agotada
[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 ~]$
El ping normal realmente te muestra los tiempos de espera. Al observar el valor seq = entre pings, puedes decir cuántos tiempos de espera
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
EG 3 tiempos de espera ocurrieron entre los 2 pings anteriores desde que el primero fue seq=8
y el segundo fue seq=11
(9 y 10 fueron tiempos muertos) seq=sequence
.