Câu trả lời:
fping không hoạt động với tôi ... Trong trường hợp của tôi, hầu hết thời gian tôi muốn thấy điều này về cơ bản là trong quá trình khởi động lại máy chủ ... điều này hoạt động khá tốt trên Windows ...
Tôi xây dựng một tập lệnh đơn giản (mở rộng câu trả lời @entropo) để giúp tôi về điều đó, có thể giúp trả lời câu hỏi này:
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
Và cách sử dụng là một cái gì đó như:
Điều tốt nhất tôi tìm thấy là sử dụng cờ -O (Lưu ý rằng nó không hoạt động trên tất cả các bản phát hành - sử dụng Linux Mint 17.1 Rebecca IPUTILS-PING 3: 20121221-4ubfox1.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
Từ trang người đàn ông:
-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
; trên Debian Wheezy tôi nhận được " ping: invalid option -- 'O'
", nhưng trên Jessie, nó hoạt động như bạn lưu ý. Bạn có thể cập nhật câu trả lời của mình để bao gồm thông tin này.
Khi tôi sử dụng ping để xem máy chủ lưu trữ trong shell script, tôi sẽ làm như thế này:
ping -W 1 -c 1 $HOST 2>&1 > /dev/null || (echo -n "dead!"; false) && command-that-needs-host-to-be-up
Về cơ bản, gửi một ICMP hết thời gian trong một giây mà không có đầu ra và sử dụng mã thoát để chuyển tiếp hành động.
Không có cách nào cho cái chung ping
Để làm việc đó. Nếu bạn đang cố gắng tạo kịch bản gì đó, bạn có một số tùy chọn:
ping -c 2 <ip>
RESULT=$?
echo $RESULT
1
Nếu ping thất bại, $?
sẽ là 1, nếu ping thành công, $?
sẽ là 0.
Tùy chọn khác đang sử dụng fping
hoạt động rất nhiều như Cisco ping
:
$ fping 200.1.1.1
200.1.1.1 is unreachable
$ fping 192.168.1.1
192.168.1.1 is alive
Kịch bản ở trên của bruno.braga chỉ hoạt động tốt, tuy nhiên cá nhân tôi thích sử dụng bí danh trong cấu hình shell (như .bashrc) để nó có thể là trường hợp sử dụng hàng ngày.
Giải pháp của tôi dưới đây cũng tự động tính toán số thứ tự Yêu cầu ECHO:
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'
Dưới đây là ví dụ đầu ra khi máy chủ không ổn định với thời gian chờ:
$ 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
Tất nhiên, nhược điểm là: không có số liệu thống kê cuối cùng khi nhấn CTRL-C. Nếu muốn, điều đó cũng có thể tính toán min / avg / max theo shell script, mdev vượt xa phạm vi.
Tôi sợ nhưng không có giải pháp 100% cho điều đó với ping tiêu chuẩn. Ngay cả với ping -v cho ping đầu ra dài dòng sẽ im lặng trong trường hợp hết thời gian. Bạn có thể thử sử dụng:
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
Điều này sẽ dừng ping sau 2 giây và sau đó hiển thị số lượng gói được truyền và mất gói. Một lựa chọn khác là sử dụng 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
là tốt, và BTW -e
không cần thiết khi -l
hoặc là -c
được thêm vào, chỉ có thể sử dụng fping -l 8.8.8.8
, đầu ra là như nhau.
Tôi thực sự thích kịch bản shell từ Bruno. Tôi đã thêm một dòng để tạo một tập tin với tất cả các thất bại.
tiếng vang -e " date +'%Y/%m/%d %H:%M:%S'
.
Không có kịch bản
ping -f -i 1 hostname
Ưu điểm : lệnh Linux tiêu chuẩn - không có gì để cài đặt hoặc tập lệnh.
Nhược điểm :
Với một kịch bản tối thiểu
#!/bin/bash
while :; do
ping -W1 -c 1 "$@" | grep 'bytes from '
case $? in
0 ) sleep 1 ;;
1 ) echo -e "request timeout" ;;
* ) exit ;;
esac
done
Nhược điểm : Bạn không có số liệu thống kê ở cuối và bạn không thể sử dụng 3 tùy chọn ping này:
-i
để thay đổi khoảng thời gian giữa các gói gửi (được mã hóa thành 1 giây) -W
để thay đổi thời gian chờ (mã hóa cứng thành 1 giây) -c
dừng lại sau khi gửi N gói BTW: Đây là một trong những ví dụ cực kỳ hiếm về chức năng tôi thực sự nhớ từ công cụ Linux CLI nhưng tôi tìm thấy trong một công cụ windows. Việc thực thi chứng minh quy tắc như họ nói :-)
Nếu bạn muốn thực hiện ping liên tục giống như các cửa sổ và với dấu thời gian, hãy sử dụng cái này.
Hãy thay thế 192.168.0.1
với địa chỉ IP của riêng bạn
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
Ví dụ Trả lời 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 ~]$
Yêu cầu ví dụ đã hết hạn
[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 bình thường thực sự cho bạn thấy thời gian chờ. Bằng cách nhìn vào giá trị seq = giữa các ping, bạn có thể biết được bao nhiêu thời gian chờ
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
Thời gian nghỉ 3 lần xảy ra giữa 2 lần trên kể từ lần đầu tiên là seq=8
và cái thứ hai là seq=11
(9 và 10 là thời gian chờ) seq=sequence
.