Yanıtlar:
fping benim için çalışmadı ... Benim durumumda, çoğu zaman bu temelde sunucu yeniden başlatma sırasında olduğunu görmek istiyorum ... Bu Windows üzerinde oldukça iyi çalışıyor ...
Bu soruyu cevaplamanıza yardımcı olabilecek basit bir komut dosyası (genişletilmiş @entropo yanıtı) oluşturuyorum:
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
Ve kullanım şöyle bir şeydir:
Bulduğum en iyi şey -O bayrağını kullanmaktı (Linux Mint 17.1 Rebecca IPUTILS-PING 3: 20121221-4ubuntu1.1 kullanarak tüm dağıtımlarda çalışmadığını unutmayın)
$ 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
Man sayfasından:
-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
; Debian Wheezy'de " ping: invalid option -- 'O'
" alıyorum , ama Jessie'de not ettiğin gibi çalışıyor. Cevabınızı bu bilgileri içerecek şekilde güncellemek isteyebilirsiniz. (Ayrıca çıktı için önceden biçimlendirilmiş metin ve manpage bilgi kullanmak için önerilen bir düzenleme gönderdim)
Bir ana bilgisayarın kabuk komut dosyalarında olup olmadığını görmek için ping kullandığımda, böyle bir şey yapıyorum:
ping -W 1 -c 1 $HOST 2>&1 > /dev/null || (echo -n "dead!"; false) && command-that-needs-host-to-be-up
Temel olarak, çıkışı olmayan bir saniyede zaman aşımına uğrayan ve daha sonraki eylemleri geçmek için çıkış kodunu kullanan bir ICMP gönderir.
Halkın ping
bunu yapmasının bir yolu yok. Bir şey komut dosyası oluşturmaya çalışıyorsanız, bazı seçenekleriniz vardır:
ping -c 2 <ip>
RESULT=$?
echo $RESULT
1
Ping başarısız olursa $?
1, ping başarılı $?
olursa 0 olur.
Diğer seçenek fping
Cisco gibi çok işe yarıyor ping
:
$ fping 200.1.1.1
200.1.1.1 is unreachable
$ fping 192.168.1.1
192.168.1.1 is alive
Bruno.braga tarafından yukarıdaki komut dosyası gayet iyi çalışıyor, ancak kişisel olarak bir kabuk profilinde (.bashrc gibi) bir takma ad kullanmayı tercih ediyorum, böylece günlük kullanım durumu olabilir.
Aşağıdaki çözümüm de ECHO İstek sıra numarasını otomatik olarak hesaplıyor:
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'
Ana bilgisayar bir zaman aşımı ile kararsız olduğunda çıktı örneği:
$ 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
Tabii ki, dezavantajı: CTRL-C'ye basıldığında sonunda istatistik yok. İstenirse, kabuk betiği ile min / avg / max hesaplamak da mümkün olur, mdev kapsamın çok ötesindedir.
Korkarım ama standart ping ile buna% 100 çözüm yoktur. Ayrıntılı çıktı için ping -v bile zaman aşımı durumunda ping sessiz olur. Kullanmayı deneyebilirsiniz:
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
Bu, 2 saniye sonra ping işlemini durduracak ve sonra iletilen paket sayısını ve paket kaybını gösterecektir. Başka bir seçenek mtr kullanmak olacaktır .
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
iyi ve BTW, veya eklendiğinde -e
gerekli değildir , sadece kullanabilir , çıkış aynıdır. -l
-c
fping -l 8.8.8.8
Bruno'nun kabuk senaryosunu gerçekten çok seviyorum. Tüm hataları içeren bir dosya oluşturmak için bir satır ekledim.
echo -e " date +'%Y/%m/%d %H:%M:%S'
- host $ host \ 033 [0; 31mdown \ 033 [0m" >> ./lostpackets.txt
Hiçbir şey yazmadan
ping -f -i 1 hostname
Avantajları : standart Linux komutu - kurulacak veya komut dosyası olmayan.
Dezavantajları :
En az komut dosyasıyla
#!/bin/bash
while :; do
ping -W1 -c 1 "$@" | grep 'bytes from '
case $? in
0 ) sleep 1 ;;
1 ) echo -e "request timeout" ;;
* ) exit ;;
esac
done
Dezavantajları : Sonunda istatistik almazsınız ve şu 3 ping seçeneğini kullanamazsınız:
-i
gönderme paketleri arasındaki aralığı değiştirmek için (1 sn'ye kadar sabit kodlanmıştır)-W
zaman aşımını değiştirmek için (1sn olarak kodlanmıştır)-c
paket gönderdikten sonra durmakBTW: Bir Linux CLI aracından gerçekten özlediğim çok nadir işlevsellik örneklerinden biri ama bir Windows aracında buluyorum. Dediği gibi kuralı kanıtlayan infaz :-)
Tıpkı pencereler gibi ve zaman damgasıyla sürekli ping yapmak istiyorsanız, bunu kullanın. 192.168.0.1
Kendi IP Adresinizle değiştirmekten çekinmeyin
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
Örnek Yanıt Tamam
[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 ~]$
Örnek İstek zaman aşımına uğradı
[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 ~]$
Normal Ping aslında zaman aşımlarını gösterir. Pingler arasındaki seq = değerine bakarak kaç zaman aşımı olduğunu söyleyebilirsiniz
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 birincisi seq=8
ve ikincisi olduğu için yukarıdaki 2 ping arasında 3 zaman aşımı meydana geldi seq=11
(9 ve 10 zaman aşımlarıydı)
seq=sequence
.