Respostas:
O fping não funcionou para mim ... No meu caso, na maioria das vezes eu quero ver isso basicamente durante a reinicialização do servidor ... isso funciona muito bem no Windows ...
Eu construo um script simples (expandindo a resposta @entropo) para me ajudar nisso, o que pode ajudar a responder a esta pergunta:
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 o uso é algo como:
A melhor coisa que encontrei foi usar o sinalizador -O (observe que ele não funciona em todas as distros - usando o 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
Na página do 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
; no Debian Wheezy recebo " ping: invalid option -- 'O'
", mas no Jessie funciona como você observa. Você pode atualizar sua resposta para incluir essas informações. (Eu também apresentaram uma edição sugerido o uso de texto pré-formatado para a saída e a informação da página de manual)
Quando eu uso o ping para ver se um host está em scripts de shell, faço algo assim:
ping -W 1 -c 1 $HOST 2>&1 > /dev/null || (echo -n "dead!"; false) && command-that-needs-host-to-be-up
Basicamente, envia um ICMP que atinge o tempo limite em um segundo sem saída e usa o código de saída para bloquear outras ações.
Não há como o comum ping
fazer isso. Se você está tentando criar um script, você tem algumas opções:
ping -c 2 <ip>
RESULT=$?
echo $RESULT
1
Se o ping falhar, $?
será 1, se o ping for bem-sucedido, $?
será 0.
A outra opção é usar fping
isso funciona muito como 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
O script acima de bruno.braga funciona muito bem, no entanto, pessoalmente, eu prefiro um alias de uso em um perfil de shell (como .bashrc), para que possa ser um caso de uso diário.
Minha solução abaixo também calcula o número de sequência da solicitação ECHO automaticamente:
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'
Aqui está o exemplo de saída quando o host está instável com um tempo limite:
$ 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
Obviamente, a desvantagem é: nenhuma estatística no final quando CTRL-C é pressionado. Se desejado, também seria possível calcular min / avg / max pelo shell script, o mdev está muito além do escopo.
Receio, mas não há solução 100% para isso com ping padrão. Mesmo com ping -v para saída detalhada, o ping seria silencioso em caso de tempo limite. Você pode tentar 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
Isso interromperia o ping após 2 segundos e mostraria o número de pacotes transmitidos e a perda de pacotes. Outra opção seria usar o 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
é bom, e BTW -e
não é necessário quando -l
ou -c
é adicionado, poderia apenas usar fping -l 8.8.8.8
, a saída é a mesma.
Eu realmente gosto do shell script do Bruno. Eu adicionei uma linha para criar um arquivo com todas as falhas.
echo -e " date +'%Y/%m/%d %H:%M:%S'
- host $ host é \ 033 [0; 31mdown \ 033 [0m" >> ./lostpackets.txt
Sem escrever nada
ping -f -i 1 hostname
Vantagens : comando padrão do Linux - nada para instalar ou script.
Desvantagens :
Com um script 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
Desvantagens : você não obtém estatísticas no final e não pode usar estas três opções de ping:
-i
para alterar o intervalo entre o envio de pacotes (é codificado para 1 segundo)-W
para alterar o tempo limite (é codificado para 1 segundo)-c
parar após enviar N pacotesBTW: Este é um dos exemplos extremamente raros de funcionalidade que realmente sinto falta de uma ferramenta CLI do Linux, mas encontro em uma ferramenta do Windows. A execução que prova a regra como eles dizem :-)
Se você deseja executar um ping contínuo, exatamente como o Windows e com carimbo de data e hora, use este. Sinta-se livre para substituir 192.168.0.1
por seu próprio endereço 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
Exemplo de resposta 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 ~]$
A solicitação de exemplo expirou
[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 ~]$
O Ping normal realmente mostra tempos limite. Observando o valor seq = entre pings, você pode dizer quantos tempos limites
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
Ocorreram três intervalos de tempo do EG 3 entre os 2 pings acima desde o primeiro seq=8
e o segundo foi seq=11
(9 e 10 foram intervalos)
seq=sequence
.