ฉันจะตั้งค่าการหมดเวลาสั้น ๆ ด้วยคำสั่ง ping ได้อย่างไร


49

ฉันพยายามเขียนสคริปต์ที่แสดงโฮสต์ทั้งหมดใน LAN ของฉัน (มีประมาณ 20 ตัว) และเขียนสถานะ ping ถัดจากโฮสต์แต่ละตัว ฉันมีไฟล์สัญญาเช่า DHCP ดังนั้นฉันจึงมี IP ทั้งหมด (เช่น 10.0.0.1, 10.0.0.2 เป็นต้น) สิ่งที่ฉันต้องการก็คือสถานะ ping สำหรับแต่ละโฮสต์

ดังนั้นสคริปต์ของฉันเปิดตัว ping เดียวสำหรับแต่ละโฮสต์:

ping -c 1 10.0.0.1

น่าเสียดายที่เมื่อโฮสต์ออฟไลน์การ ping ใช้เวลานานในการหมดเวลา ฉันจะตรวจสอบman ping, ดูเหมือนจะมีสองตัวเลือกการตั้งค่าความล่าช้าหมดเวลา: และ-w deadline -W timeoutฉันคิดว่าฉันสนใจในภายหลัง

ดังนั้นฉันจึงลองทำสิ่งนี้:

ping -c 1 -W 1 10.0.0.1

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

ping -c 1 -W 0.1 10.0.0.1  # timeout option is ignored, apparently

มีวิธีตั้งค่าการหมดเวลาเป็นค่าที่ต่ำกว่าหรือไม่ ถ้าไม่มีมีทางเลือกอื่นอีกไหม?

แก้ไข

  • ระบบปฏิบัติการคือ Debian Lenny
  • ไพร่พลที่ฉันพยายามจะปิงเป็นจุดเชื่อมต่อจริง พวกเขาอยู่บน vlan และ subnet เดียวกันกับผู้ใช้ (เพื่อความง่ายในการปรับใช้และการแทนที่) นี่คือเหตุผลที่ฉันไม่ต้องการสแกนเครือข่ายย่อยทั้งหมด ( ping -bเช่น)

แก้ไข # 2

ฉันยอมรับfpingวิธีแก้ไขปัญหา (ขอบคุณสำหรับคำตอบอื่น ๆ ทั้งหมด) คำสั่งนี้ทำสิ่งที่ฉันกำลังมองหา:

fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4

คำสั่งนี้ใช้เวลาอย่างน้อยที่สุด 500 มิลลิวินาทีในการทำให้เสร็จสมบูรณ์และให้สถานะ ping ของโฮสต์ทั้งหมดพร้อมกัน

10.0.0.1 : [0], 84 bytes, 5.71 ms (5.71 avg, 0% loss)
10.0.0.2 : [0], 84 bytes, 7.95 ms (7.95 avg, 0% loss)
10.0.0.3 : [0], 84 bytes, 16.1 ms (16.1 avg, 0% loss)
10.0.0.4 : [0], 84 bytes, 48.0 ms (48.0 avg, 0% loss)

10.0.0.1 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 5.71/5.71/5.71
10.0.0.2 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 7.95/7.95/7.95
10.0.0.3 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 16.1/16.1/16.1
10.0.0.4 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 48.0/48.0/48.0

บน Debian Lenny การติดตั้งเป็นเรื่องเล็กน้อย:

aptitude update
aptitude install fping

คำตอบ:


41

fpingอาจเป็นเครื่องมือที่ดีกว่า ping หุ้นที่คุณใช้อยู่ คุณใช้ระบบปฏิบัติการอะไร

  • "fping แตกต่างจาก ping ซึ่งคุณสามารถระบุจำนวนเป้าหมายใด ๆ บนบรรทัดคำสั่งหรือระบุไฟล์ที่มีรายการเป้าหมายไปยัง ping"
  • "แทนที่จะส่งไปยังเป้าหมายหนึ่งจนกว่ามันจะหมดเวลาหรือตอบกลับ fping จะส่งแพ็คเก็ตปิงออกไปและไปยังเป้าหมายต่อไปในรูปแบบโรบิน"
  • "ต่างจาก ping, fping นั้นใช้ในสคริปต์ดังนั้นเอาท์พุทของมันจึงถูกออกแบบมาให้แยกวิเคราะห์ได้ง่าย"

1
ใช้งานได้ดีขอบคุณนี่คือสิ่งที่ฉันกำลังมองหา คำสั่งนี้ทำงานได้ดี: fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 ... สิ่งทั้งหมดใช้เวลาครึ่งวินาทีและฉันได้รับผลลัพธ์สำหรับโฮสต์ทั้งหมดในครั้งเดียว เครื่องมือที่ยอดเยี่ยม :-))
MiniQuark

37

สำหรับคนที่กำลังมองหาทางออกที่เกี่ยวข้องpingให้ใช้-iสวิตช์

ping -i 0.2 www.google.com

หรือถ้าคุณต้องการใช้ 0.1 คุณจะต้องเรียกใช้เป็นรูท

sudo ping -i 0.1 www.google.com

ไม่จำเป็นต้องดาวน์โหลดโปรแกรมอรรถประโยชน์เพิ่มเติม


4
+1 จากฉัน นี่เป็นผลลัพธ์แรกเมื่อ googling "ping timeout" และนี่คือสิ่งที่ฉันกำลังมองหา
Steven Jeffries

@StevenJeffries เหมือนกันที่นี่!
Luc

1
ในกรณีของโฮสต์ที่ตายโซลูชันนี้จะพิมพ์ผลลัพธ์ที่มีประโยชน์ครั้งแรกหลังจากนั้นประมาณ 1 วินาที นี่เป็นคำตอบที่ผิดอย่างแน่นอนเนื่องจาก @MarcelBurkhard พูดถึงแล้ว
Victor Yarema

1
ปัญหาเกี่ยวกับวิธีแก้ปัญหานี้คือ -i 0.1 จะไม่รอ 100ms แต่จะนานกว่านั้นสำหรับการปิงที่ใช้เวลามากกว่า 100 มิลลิวินาทีจึงเป็นการจับเวลา
Llamageddon

2
คำตอบนี้ไม่ถูกต้อง - มันไม่เปลี่ยนระยะเวลาที่pingจะรอการตอบกลับ - มันแค่ส่ง pings ที่ต่อเนื่องกันเร็วขึ้น ....
Mtl Dev

21

คุณสามารถตั้งค่าการหมดเวลาสั้น ๆ ด้วยtimeoutคำสั่งบน Ubuntu / Debian:

timeout 0.2 ping -c1 fqdn || { do_work }

คำตอบที่ดี! ตอนนี้ฉันทำแล้ว: หมดเวลา 1 ping -c 1 test.com
vrijdenker

1
การหมดเวลารุ่นของฉันยอมรับได้เพียง 1 วินาทีเท่านั้น timeout (GNU coreutils) 8.4.
slm

ฉันชอบโซลูชันนี้สามารถใช้ได้กับคำสั่งอื่น ๆ ทั้งหมด
datdinhquoc

@slm มันแปลกที่เวอร์ชั่นของคุณไม่รองรับน้อยกว่าหนึ่งวินาที มันทำงานสำหรับฉัน: DURATION is a floating point number with an optional suffix: 's' for seconds (the default),... ในกรณีของรายงานman timeout GNU coreutils 8.26BWT ฉันใช้ Ubuntu 17.04
Victor Yarema

นี่เป็นเพียงสิ่งเดียวที่ใช้ได้ผลถ้าคุณต้องการลดการหมดเวลาใช้งาน (โฮสต์ไม่ตอบสนอง) ... คุณต้องทำการคำนวณทางคณิตศาสตร์: การหมดเวลาจะต้องมากกว่า "-c" * "-i" ของคำสั่ง ping-
Marki

13

ฉันจะใช้ nmap สำหรับงานนี้

nmap -sP --max-retries=1 --host-timeout=1500ms 10.0.0.1

ดูเอกสาร nmapสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับเรื่องนี้


เป็นการโทรที่ดี .. นี่เป็นวิธีที่ "ยอดเยี่ยม" ที่จะทำ: D +1
Arenstar

สวัสดีฉันเพิ่งลองทำสิ่งนี้ แต่ฉันได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้: "- การหมดเวลาของโฮสต์ถูกระบุเป็นมิลลิวินาทีเว้นแต่คุณจะผ่านการรับรองโดยการต่อท้าย 's', 'm', 'h' หรือ 'd' ค่า ต้องมากกว่า 1,500 มิลลิวินาที "
MiniQuark

ฉันคิดว่าปัญหาชัดเจนว่าการหมดเวลาไม่สามารถสั้นกว่า 1500ms กว่าที่คุณควรมองหาตัวเลือก nmap regaring ฉันคิดว่า
ก้าว

ดูเหมือนว่าจะส่งคำขอเดียวเท่านั้น ฉันกำลังมองหาการตรวจจับข้อผิดพลาดอย่างต่อเนื่องฉันมาที่นี่โดย Googling "ping มิลลิวินาทีหมดเวลา" Nmap เสนอ infinie-pings เหมือน ubuntu ping หรือไม่?
ThorSummoner

การตั้งค่าการหมดเวลาเป็นบางสิ่งที่ต่ำกว่าหนึ่งวินาทีจะเกี่ยวข้องกับการใช้ผู้ใช้ที่ได้รับสิทธิพิเศษเช่นเดียวกับใน @ victor-bjelkholm คำตอบ
thrau

4

คุณอาจต้องการดูเครื่องมือ arp ping หากโฮสต์ทั้งหมดของคุณอยู่ใน LAN จริงมันทำสิ่งเดียวกัน แต่ใช้เลเยอร์ 2 arp แพ็คเก็ตเพื่อทำ 'ping' คุณสามารถใช้การรวมกันของ arpping และ icmp ping หรือในความเป็นจริง tcp ping เพื่อรวบรวมความล้มเหลว ตัวอย่างคือความล้มเหลวของสแต็ก tcp แม้ว่าจะหายากในวันนี้เราสามารถค้นหาได้ว่าสแต็คเครื่อง tcp ล้มเหลวเนื่องจากเครื่องจะไม่ตอบสนองต่อการ ping อย่างไรก็ตามมันจะตอบสนองต่อ arp (ซึ่งเป็นรหัสที่แตกต่างกันในโฮสต์) .

การใช้การรวมกันของ arpping, tcpping และ icmp ping คุณสามารถค้นหาว่าบริการบนเครื่องขัดข้องสแต็ก tcp ล้มเหลวหรือเครื่องล็อคอย่างสมบูรณ์ หากคุณมีสวิตช์อีเธอร์เน็ตที่มีการจัดการคุณสามารถรับข้อมูลการเชื่อมโยงทางกายภาพได้แสดงให้เห็นว่าเครื่องเปิดอยู่จริงหรือถูกถอดปลั๊กออกจริงหรือไม่ เรามีสถานการณ์ที่จะปิดเครื่อง (ลูกค้าในห้องสาธารณะ) เรารวบรวมข้อมูลและการส่งแพ็กเก็ต LAN เพื่อเปิดเครื่อง :-)

โซลูชั่นใดที่คุณสร้างหากเครือข่ายของคุณไม่ว่างให้คิดถึงการใช้งาน qos บางประเภทเพื่อให้แพ็กเก็ตการตรวจสอบของคุณให้ความสำคัญกับเครือข่ายการสูญเสียแพ็กเก็ตการวัดเนื่องจากความแออัดของเครือข่ายอาจทำให้เกิดสัญญาณเตือนผิดพลาด หากใช้ qos สำหรับตรวจสอบแพ็กเก็ตคุณจะต้องคิดถึงการรวบรวมข้อมูลเกี่ยวกับการใช้งานเครือข่าย

ดังนั้นคุณสามารถสร้างโซลูชันการตรวจสอบที่ซับซ้อนหรือง่ายตามที่คุณต้องการ เราพบว่าแม้แต่ระบบการตรวจสอบขั้นพื้นฐานที่สุดก็เป็นขั้นตอนในทิศทางที่ถูกต้องอย่างน้อยผู้ดูแลระบบบางรายก็จับตาดูเครื่อง :-)

โชคดี!


3

@ jordon-bedwell มีข้อเสนอแนะที่ดี

@ laszlo-valko https://stackoverflow.com/questions/20359487/why-does-ping-not-timeout-in-linuxอธิบายว่า ping timeouts เริ่มต้นหลังจากที่มีการกำหนดที่อยู่ IP เท่านั้น หากคุณใช้ dns และเวิร์กสเตชันของคุณออฟไลน์อยู่ ping จะไม่สามารถระบุที่อยู่ IP ได้และดูเหมือนว่าจะรอประมาณ 20 + วินาทีเริ่มต้นก่อนที่จะส่งคืนค่าเท็จ

การใช้เครื่องมือ 'หมดเวลา' ของ linux ช่วยให้สามารถควบคุมได้มากขึ้นเมื่อรัน ping ด้วยชื่อโดเมน

ขอบคุณเพื่อน


2

ใช้สวิตช์-wทั้งบน Windows และ Debian

มันเป็นวิธีที่รวดเร็วในการตรวจสอบว่าเครื่องตอบสนองหรือไม่โดยสมมติว่าเครื่องตอบสนองภายในเวลาน้อยกว่าจำนวนวินาทีที่ระบุ

ping -w 1 192.168.80.105

PING 192.168.80.105 (192.168.80.105) 56(84) bytes of data.

--- 192.168.80.105 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 999ms

1

หากคุณสามารถสแกนซับเน็ตของคุณ (หรือส่วนหนึ่งของมัน) โดยไม่เรียกสัญญาณเตือนความปลอดภัยและไม่ต้องกังวลกับข้อมูลเพิ่มเติมบิตเครื่องสแกน IP ของ Angry ทำงานได้อย่างรวดเร็วฟรีให้คุณคลิกเพื่อจัดเรียงตามสถานะและสามารถให้ข้อมูลรายละเอียดเพิ่มเติม .


0

ทำไมไม่เปิด ping ในพื้นหลังโดยเอาท์พุทเป็นไฟล์ชั่วคราวควบคู่ไปกับโฮสต์ทุกตัว จากนั้นหลับเป็นเวลาหนึ่งวินาทีฆ่ากระบวนการ ping ใด ๆ ที่ยังคงทำงานอยู่และอ่านไฟล์เพื่อรวบรวมเอาต์พุต


1
ฉันเดาว่ามันใช้ได้ แต่ฉันกำลังมองหาวิธีที่ง่ายกว่า ขอบคุณอยู่ดี
MiniQuark

วิธีนี้ไม่ได้เพิ่มขนาด
Synetech

0

การหมดเวลาเป็นค่าจำนวนเต็มซึ่งระบุว่าสามารถส่งแพ็กเก็ตได้ไกลและนานเท่าใด ค่าต่ำกว่า 1 นั้นไม่มีความหมาย ค่า 1 หมายถึงคุณกำลังกระตุกเพื่อนบ้านในทันทีเท่านั้น

วิธีเดียวที่จะเร่งความเร็วของสิ่งต่าง ๆ คือเรียกใช้การตรวจสอบพื้นหลังและเก็บเกี่ยวผลลัพธ์ นี่คือสิ่งที่เครื่องมืออย่าง Nagios ทำ


1
ฉันขอโทษ แต่ฉันไม่คิดว่านี่เป็นเรื่องจริง หน้าคนค่อนข้างชัดเจนว่า -W ระบุ "เวลาที่จะรอการตอบสนองเป็นวินาที"; มันไม่ใช่มิติและแม้ว่า ping จะไม่ให้เกียรติค่าต่ำกว่า 1 (ดังนั้นคำถาม) การหมดเวลาในวินาทีที่สองนั้นไม่ได้ไร้ความหมาย หากคุณจะให้อภัยฉันคุณอาจสับสน -W กับ -t ซึ่งเป็นการตั้งค่าภายหลังฟิลด์ IP TTL (hop count) ซึ่งจะทำงานตามที่คุณอธิบายไว้และค่าที่ต่ำกว่า 1 นั้นไม่มีความหมาย
MadHatter

-W เป็นเวลาที่กระบวนการ ping รอการตอบกลับและอาจสมเหตุสมผลในการตั้งค่าให้ต่ำกว่าจำนวน hop เมื่อนับจำนวน hop สูงซึ่งตามปกติคือ ภายในสามวินาทีคุณมักจะเข้าสู่เงื่อนไขการลองใหม่ เครื่องมือบางอย่างอาจอนุญาตให้ใช้ตัวจับเวลาที่ละเอียดยิ่งขึ้นสำหรับการรอ แต่สำหรับการใช้งานส่วนใหญ่ของ ping วินาทีเป็นหน่วยที่สมเหตุสมผล
BillThor

0

คุณสามารถลองสิ่งนี้ แต่มันใช้เวลา 15 นาทีในการวิ่ง

a=258
while [ $a -ge 1 ]
do
    echo "10.0.0.$a"
    sudo ping -i 0.1 -c 1 "10.0.0.$a">>/home/$USER/output.log
   a=`expr $a - 1`
done
cat /home/$USER/output.log|grep -i "icmp_req=1"
cat /dev/null>/home/$USER/output.log

ดูเหมือนว่าnmapจะเป็นเครื่องมือที่เหมาะสมสำหรับงาน
kasperd


-1

ping มีตัวเลือก [-t timeout] และ [-W waittime] เพื่อให้คุณสามารถทำได้:

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