Linux Ping: แสดงการหมดเวลา


17

ฉันจะทำให้ Linux ping แสดงการร้องขอ 'หมดเวลา' แทนการละเว้นเอาต์พุตได้อย่างไร

เช่นเดียวกับ ping เวอร์ชัน Windows


คุณไม่แสดงการหมดเวลาอย่างไร
Michael

คำตอบ:


12

fping ไม่ได้ผลสำหรับฉัน ... ในกรณีของฉันส่วนใหญ่เวลาที่ฉันต้องการดูนี่เป็นพื้นระหว่างการรีบูตเซิร์ฟเวอร์ ... มันใช้งานได้ดีบน Windows ...

ฉันสร้างสคริปต์ง่าย ๆ (ขยายคำตอบ @entropo) เพื่อช่วยฉันในเรื่องนั้นซึ่งอาจช่วยตอบคำถามนี้:

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

และการใช้งานเป็นสิ่งที่ชอบ:

ป้อนคำอธิบายรูปภาพที่นี่


คุณกรุณาแก้ไขเพื่อรายงานเปอร์เซ็นต์การสูญเสียแพ็กเก็ตและนับในทุก ๆ บรรทัดได้หรือไม่?
Pol Hallen

21

สิ่งที่ดีที่สุดที่ฉันพบคือใช้แฟล็ก -O (โปรดทราบว่ามันใช้ไม่ได้กับ distros ทั้งหมด - การใช้ 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

จากหน้าคน:

-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 ยินดีต้อนรับสู่ Super User และขอบคุณสำหรับคำตอบสำหรับคำถามนี้! สิ่งนี้ดูเหมือนจะขึ้นอยู่กับรุ่นของping; ใน Debian Wheezy ฉันได้ " ping: invalid option -- 'O'" แต่ใน Jessie มันทำงานได้ตามที่คุณทราบ คุณอาจต้องการอัปเดตคำตอบของคุณเพื่อรวมข้อมูลนี้ (ฉันยังได้ส่งการแก้ไขที่แนะนำเพื่อใช้ข้อความที่จัดรูปแบบล่วงหน้าสำหรับการส่งออกและข้อมูลจาก manpage)
bertieb

5

เมื่อฉันใช้ ping เพื่อดูว่าโฮสต์อยู่ในเชลล์สคริปไหมฉันจะทำสิ่งนี้:

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

โดยทั่วไปส่ง ICMP หนึ่งตัวที่หมดเวลาในหนึ่งวินาทีโดยไม่มีเอาต์พุตและใช้รหัสออกเพื่อเกตการดำเนินการเพิ่มเติม


2

ไม่มีทางที่คนธรรมดาpingจะทำอย่างนั้นได้ หากคุณพยายามเขียนสคริปต์สิ่งที่คุณมีตัวเลือก:

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

ถ้า ping ล้มเหลว$?จะเป็น 1 หาก ping สำเร็จ$?จะเป็น 0

ตัวเลือกอื่นกำลังใช้fpingงานได้เหมือน 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

สคริปต์ข้างต้นโดย bruno.braga ทำงานได้ดี แต่โดยส่วนตัวแล้วฉันชอบใช้นามแฝงในโปรไฟล์เชลล์ (เช่น. bashrc) เพื่อให้เป็นกรณีใช้งานรายวัน

โซลูชันของฉันด้านล่างยังคำนวณหมายเลขลำดับ 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'

นี่คือตัวอย่างเอาต์พุตเมื่อโฮสต์ไม่เสถียรด้วยการหมดเวลา:

$ 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

แน่นอนข้อเสียเปรียบคือ: ไม่มีสถิติในท้ายที่สุดเมื่อกด CTRL-C หากต้องการก็สามารถคำนวณ min / avg / max ด้วยเชลล์สคริปต์ได้เช่นกัน mdev อยู่ไกลเกินขอบเขต


1

ฉันกลัว แต่ไม่มีวิธีแก้ปัญหา 100% สำหรับ ping มาตรฐาน แม้จะมีping -vสำหรับการส่งออก ping verbose ก็จะเงียบในกรณีที่หมดเวลา คุณสามารถลองใช้:

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

สิ่งนี้จะหยุดการ ping หลังจาก 2 วินาทีจากนั้นแสดงจำนวนของแพ็กเก็ตที่ส่งและการสูญเสียแพ็กเก็ต อีกตัวเลือกหนึ่งที่จะใช้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

อย่างไรก็ตามโปรดทราบว่าหลังจาก fping รันไปสักสองสามนาทีการหมดเวลาเป็นระยะจะไม่มีผลต่อการสูญเสียที่พิมพ์ออกมา (1 แพ็คเก็ตจาก 1,000 สูญเสีย 0.1% และ fping จะทำให้การพิมพ์ 0%) ไม่ต้องพูดถึงว่าไกลเกินกว่าที่จะสังเกตเห็น "หมดเวลาคำขอ" มากกว่าการจับเวลาที่ 18% เปลี่ยนเป็น 19% (ไม่ต้องพูดถึงว่าคุณต้องเพิกเฉยต่อช่วงเวลาที่ 18% ลอยไปถึง 17%)
ndemou

fpingเป็นสิ่งที่ดีและ BTW ที่-eไม่จำเป็นเมื่อมีการเพิ่ม-lหรือ-cเพิ่มสามารถใช้งานได้fping -l 8.8.8.8ผลลัพธ์ก็เหมือนกัน
Eric Wang

0

ฉันชอบเชลล์สคริปต์จากบรูโนมาก ฉันเพิ่มบรรทัดเพื่อสร้างไฟล์ที่มีความล้มเหลวทั้งหมด

echo -e " date +'%Y/%m/%d %H:%M:%S'- โฮสต์ $ host คือ \ 033 [0; 31mdown \ 033 [0m" >> 0/lostpackets.txt


0

โดยไม่ต้องเขียนสคริปต์อะไร

ping -f -i 1 hostname

ข้อดี : คำสั่ง Linux มาตรฐาน - ไม่มีอะไรให้ติดตั้งหรือสคริปต์

ข้อเสีย :

  1. ไม่มีอะไรถูกพิมพ์ออกมาสำหรับแพ็คเก็ตที่ได้รับคำตอบสำเร็จ
  2. มันส่งเสียงบี๊บที่น่ารำคาญสำหรับแพ็คเก็ตที่ได้รับคำตอบสำเร็จ
  3. ตัวบ่งชี้ที่มองเห็นได้ของการหมดเวลานั้นน้อยที่สุดเท่าที่จะทำได้ (จุดเล็ก ๆ จะอยู่ที่หน้าจอ

ด้วยสคริปต์ที่น้อยที่สุด

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

ข้อเสีย : คุณไม่มีสถิติในตอนท้ายและคุณไม่สามารถใช้ตัวเลือก ping 3 ตัวต่อไปนี้:

  1. -i เพื่อเปลี่ยนช่วงเวลาระหว่างการส่งแพ็กเก็ต (ฮาร์ดโค้ดเป็น 1 วินาที)
  2. -W เพื่อเปลี่ยนการหมดเวลา (ฮาร์ดโค้ดเป็น 1 วินาที)
  3. -c เพื่อหยุดหลังจากส่ง N แพ็กเก็ต

BTW: นี่เป็นหนึ่งในตัวอย่างของการใช้งานที่หาได้ยากมากที่ฉันคิดถึงจากเครื่องมือ Linux CLI แต่ฉันพบในเครื่องมือ windows การประหารชีวิตที่พิสูจน์กฎตามที่พวกเขาพูดว่า :-)


0

หากคุณต้องการทำการ ping อย่างต่อเนื่องเช่นเดียวกับ windows และ timestamp ให้ใช้อันนี้ คุณสามารถแทนที่192.168.0.1ด้วยที่อยู่ IP ของคุณเอง

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

ตัวอย่างตอบตกลง

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

ตัวอย่างคำขอหมดเวลา

[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 ปกติจะแสดงการหมดเวลาให้คุณจริง ๆ โดยการดูค่า seq = ระหว่างปิงคุณสามารถบอกจำนวนหมดเวลาได้

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 ลึกหนาบางเวลาที่เกิดขึ้นระหว่าง 2 ข้างต้นปิงตั้งแต่แรกคือseq=8และเป็นคนที่สองคือseq=11 (9 และ 10 seq=sequenceมีความลึกหนาบางเวลา)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.