Linux Ping: Tunjukkan waktu habis

17

Bagaimana saya bisa membuat ping Linux untuk menunjukkan permintaan 'time out' alih-alih menghilangkan output?

Sama seperti ping versi Windows.

Andre
sumber
Bagaimana Anda tidak menunjukkan batas waktu?
Michael

Jawaban:

12

fping tidak bekerja untuk saya ... Dalam kasus saya, sebagian besar waktu saya ingin melihat ini pada dasarnya selama server reboot ... ini bekerja cukup bagus di Windows ...

Saya membuat skrip sederhana (memperluas @entropo answer) untuk membantu saya mengenai hal itu, yang dapat membantu menjawab pertanyaan ini:

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

Dan penggunaannya adalah seperti:

masukkan deskripsi gambar di sini

bruno.braga
sumber
Bisakah Anda memodifikasinya untuk melaporkan persentase kehilangan paket dan menghitung pada setiap baris?
Pol Hallen
21

Hal terbaik yang saya temukan adalah menggunakan flag -O (Perhatikan bahwa itu tidak bekerja pada semua distro - menggunakan 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

Dari halaman 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.

scoy
sumber
Hai scoy, selamat datang di Pengguna Super dan terima kasih atas jawaban untuk pertanyaan ini! Ini tampaknya tergantung pada versi ping; pada Debian Wheezy saya mendapat " ping: invalid option -- 'O'", tetapi pada Jessie itu berfungsi seperti yang Anda perhatikan. Anda mungkin ingin memperbarui jawaban Anda untuk memasukkan informasi ini. (Saya juga telah mengirimkan edit yang disarankan untuk menggunakan teks yang sudah diformat untuk output dan info dari halaman manual)
bertieb
5

Ketika saya menggunakan ping untuk melihat apakah ada host di skrip shell, saya melakukan sesuatu seperti ini:

ping -W 1 -c 1 $HOST 2>&1 > /dev/null || (echo -n "dead!"; false) && command-that-needs-host-to-be-up

Pada dasarnya, kirim satu ICMP yang habis dalam satu detik tanpa output dan gunakan kode keluar untuk melakukan tindakan selanjutnya.

entropo
sumber
2

Tidak ada cara bagi umum pinguntuk melakukan itu. Jika Anda mencoba membuat skrip sesuatu, Anda memiliki beberapa opsi:

ping -c 2 <ip>
RESULT=$?
echo $RESULT
1

Jika ping gagal, $?akan menjadi 1, jika ping berhasil, $?akan menjadi 0.

Opsi lainnya adalah menggunakan fpingyang banyak berfungsi seperti Cisco ping:

$ fping 200.1.1.1
200.1.1.1 is unreachable
$ fping 192.168.1.1
192.168.1.1 is alive

sumber
2

Script di atas oleh bruno.braga berfungsi dengan baik, namun secara pribadi saya lebih suka menggunakan alias dalam profil shell (seperti .bashrc) sehingga bisa menjadi kasus penggunaan sehari-hari.

Solusi saya di bawah ini juga menghitung nomor urut Permintaan ECHO secara otomatis:

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'

Ini adalah contoh output ketika host tidak stabil dengan batas waktu:

$ 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

Tentu saja, kelemahannya adalah: tidak ada statistik pada akhirnya ketika CTRL-C ditekan. Jika diinginkan, itu juga mungkin untuk menghitung skrip shell min / avg / max, mdev jauh di luar cakupan.

Jackie Yeh
sumber
1

Saya takut tetapi tidak ada solusi 100% untuk itu dengan ping standar. Bahkan dengan ping -v untuk ping keluaran verbose akan diam jika terjadi timeout. Anda dapat mencoba menggunakan:

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

Ini akan berhenti ping setelah 2 detik dan kemudian menunjukkan jumlah paket yang dikirimkan dan kehilangan paket. Pilihan lain adalah menggunakan mtr .


sumber
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 [email protected]
nvluan
sumber
Namun perlu dicatat bahwa setelah menjalankan fping selama beberapa menit, timeout sporadis tidak memiliki efek pada kehilangan cetakan (1 paket dari 1000 adalah kerugian 0,1% dan fping akan tetap mencetak 0%). Belum lagi bahwa jauh lebih mudah untuk melihat "timeout permintaan" daripada menangkap waktu bahwa 18% berubah menjadi 19% (belum lagi bahwa Anda harus mengabaikan momen bahwa 18% melayang kembali ke 17%)
ndemou
fpingbaik, dan BTW -eitu tidak perlu ketika -latau -cditambahkan, bisa saja digunakan fping -l 8.8.8.8, hasilnya sama.
Eric Wang
0

Saya sangat suka skrip shell dari Bruno. Saya menambahkan baris untuk membuat file dengan semua kegagalan.

echo -e " date +'%Y/%m/%d %H:%M:%S'- host $ host adalah \ 033 [0; 31mdown \ 033 [0m" >> ./lostpackets.txt

Dave Honsvick
sumber
0

Tanpa skrip apa pun

ping -f -i 1 hostname

Keuntungan : perintah Linux standar - tidak ada yang menginstal atau skrip.

Kekurangan :

  1. TIDAK ADA yang dicetak untuk paket-paket yang berhasil dijawab
  2. Itu membuat bunyi bip yang mengganggu untuk paket yang berhasil dijawab
  3. Indikasi visual batas waktu seminimal mungkin (titik kecil tetap di layar saat paket habis).

Dengan skrip minimal

#!/bin/bash
while :; do
    ping -W1 -c 1 "$@" | grep 'bytes from '
    case $? in
        0 ) sleep 1 ;;
        1 ) echo -e "request timeout" ;;
        * ) exit ;;
    esac
done

Kekurangan : Anda tidak mendapatkan statistik pada akhirnya dan Anda tidak dapat menggunakan 3 opsi ping ini:

  1. -i untuk mengubah interval antara pengiriman paket (hardcoded ke 1detik)
  2. -W untuk mengubah batas waktu (hardcode ke 1detik)
  3. -c untuk berhenti setelah mengirim paket N

BTW: Ini adalah salah satu contoh fungsionalitas yang sangat langka yang sangat saya lewatkan dari alat Linux CLI tetapi saya temukan di alat windows. Eksekusi yang membuktikan aturan seperti yang mereka katakan :-)

ndemou
sumber
0

Jika Anda ingin melakukan ping terus menerus seperti windows dan dengan timestamp, gunakan yang ini. Jangan ragu untuk mengganti 192.168.0.1dengan Alamat IP Anda sendiri

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

Contoh Balas 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 ~]$

Permintaan Contoh habis waktu

[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 ~]$ 
Sabrina
sumber
0

Ping yang normal benar-benar menunjukkan batas waktu. Dengan melihat seq = nilai antar ping, Anda dapat mengetahui berapa banyak 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

EG 3 waktu habis terjadi antara 2 ping di atas sejak yang pertama seq=8dan yang kedua seq=11 (9 dan 10 adalah waktu habis) seq=sequence.

Clive Gerada
sumber