Jawaban:
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:
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.
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)
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.
Tidak ada cara bagi umum ping
untuk 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 fping
yang 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
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.
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 .
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
baik, dan BTW -e
itu tidak perlu ketika -l
atau -c
ditambahkan, bisa saja digunakan fping -l 8.8.8.8
, hasilnya sama.
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
Tanpa skrip apa pun
ping -f -i 1 hostname
Keuntungan : perintah Linux standar - tidak ada yang menginstal atau skrip.
Kekurangan :
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:
-i
untuk mengubah interval antara pengiriman paket (hardcoded ke 1detik)-W
untuk mengubah batas waktu (hardcode ke 1detik)-c
untuk berhenti setelah mengirim paket NBTW: 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 :-)
Jika Anda ingin melakukan ping terus menerus seperti windows dan dengan timestamp, gunakan yang ini. Jangan ragu untuk mengganti 192.168.0.1
dengan 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 ~]$
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=8
dan yang kedua seq=11
(9 dan 10 adalah waktu habis)
seq=sequence
.