Linux Ping: Zaman aşımını göster


17

Linux ping'inin çıktıyı atlamak yerine 'zaman aşımı' isteklerini göstermesini nasıl sağlayabilirim?

Tıpkı ping'in Windows sürümü gibi.


Nasıl mı değil zaman aşımı gösteriyor?
Michael

Yanıtlar:


12

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:

resim açıklamasını buraya girin


Lütfen paket kaybı yüzdesini bildirmek ve her satıra güvenmek için değiştirebilir misiniz?
Pol Hallen

21

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.


Merhaba scoy, Süper Kullanıcı'ya hoş geldiniz ve bu sorunun cevabı için teşekkür ederiz! Bu, sürümüne bağlı görünmektedir 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)
bertieb

5

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.


2

Halkın pingbunu 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 fpingCisco 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

2

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.


1

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 .


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

Ancak, fping birkaç dakika çalıştırıldıktan sonra, ara sıra zaman aşımlarının yazdırılan kayıp üzerinde sıfır etkisi olduğunu unutmayın (1000'den 1 paket% 0.1 kayıptır ve fping% 0 yazdırmaya devam edecektir). Bir "istek zaman aşımı" fark etmenin,% 18'in% 19'a dönüştüğü zamanı yakalamaktan çok daha kolay olduğunu belirtmemek gerekir (% 18'in% 17'ye geri döndüğü anı görmezden gelmek zorunda olduğunuzdan bahsetmiyorum)
ndemou

fpingiyi ve BTW, veya eklendiğinde -egerekli değildir , sadece kullanabilir , çıkış aynıdır. -l-cfping -l 8.8.8.8
Eric Wang

0

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


0

Hiçbir şey yazmadan

ping -f -i 1 hostname

Avantajları : standart Linux komutu - kurulacak veya komut dosyası olmayan.

Dezavantajları :

  1. NOTHING, başarıyla yanıtlanan paketler için yazdırılır
  2. Başarılı bir şekilde cevaplanan paketler için can sıkıcı bir bip sesi çıkarır
  3. Zaman aşımlarının görsel göstergesi olabildiğince azdır (bir paket zaman aşımına uğradığında ekranda küçük bir nokta kalır).

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:

  1. -i gönderme paketleri arasındaki aralığı değiştirmek için (1 sn'ye kadar sabit kodlanmıştır)
  2. -W zaman aşımını değiştirmek için (1sn olarak kodlanmıştır)
  3. -c paket gönderdikten sonra durmak

BTW: 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 :-)


0

Tıpkı pencereler gibi ve zaman damgasıyla sürekli ping yapmak istiyorsanız, bunu kullanın. 192.168.0.1Kendi 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 ~]$ 

0

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=8ve 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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.