Linux Ping: Hiển thị thời gian chờ


14

Làm cách nào để tạo ping Linux để hiển thị các yêu cầu 'hết thời gian' thay vì bỏ qua đầu ra?

Giống như phiên bản Windows của ping.


Bạn khỏe không không phải hiển thị thời gian chờ?
Michael

Câu trả lời:


11

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ư:

enter image description here


Bạn có thể vui lòng sửa đổi nó để báo cáo tỷ lệ phần trăm mất gói và tính trên mỗi dòng không?
Pol Hallen

13

Đ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.


Xin chào, chào mừng bạn đến với Super User và cảm ơn bạn đã trả lời câu hỏi này! Điều này dường như phụ thuộc vào phiên bản của 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.
bertieb

5

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.


2

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

2

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.


1

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 .


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

Tuy nhiên, xin lưu ý rằng sau khi fping chạy trong vài phút, thời gian chờ lẻ tẻ không ảnh hưởng đến mất in (1 gói trong số 1000 là mất 0,1% và fping sẽ tiếp tục in 0%). Chưa kể rằng việc nhận ra "thời gian chờ yêu cầu" dễ dàng hơn rất nhiều so với việc nắm bắt thời gian 18% chuyển thành 19% (chưa kể đến việc bạn phải bỏ qua thời điểm 18% trôi ngược về 17%)
ndemou

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.
Eric Wang

0

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' .


0

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 :

  1. NOTHING được in cho các gói được trả lời thành công
  2. Nó tạo ra một tiếng bíp khó chịu cho các gói được trả lời thành công
  3. Dấu hiệu trực quan của thời gian chờ là tối thiểu có thể nhận được (một chấm nhỏ vẫn ở trên màn hình khi hết gói).

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:

  1. -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)
  2. -W để thay đổi thời gian chờ (mã hóa cứng thành 1 giây)
  3. -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 :-)


0

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

0

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.