เร็วกว่า ping เพื่อตรวจสอบว่าคอมพิวเตอร์ออนไลน์หรือไม่


20

ฉันกำลังเขียนสคริปต์แลนสำหรับชุดคอมพิวเตอร์แล็บของเรา เรามี sqlite db ที่มีรายชื่อโฮสต์คอมพิวเตอร์, IP และ MAC และตอนนี้ฉัน ping แต่ละรายการด้วย '-c1' ดังนั้นมันจึงไม่ทำงานอย่างไม่มีที่สิ้นสุด - แต่แม้จะต้องรอสักพักก็มีวิธีที่เร็วกว่าในการรับ ตอบแทนที่จะปิง การใช้ ping ดูเหมือนจะทำให้สคริปต์ช้าลงเล็กน้อยเนื่องจากต้องการคำตอบ ping เพื่อดำเนินการต่อ

ขอบคุณมากสำหรับคำแนะนำใด ๆ !

คำตอบ:


20

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

แต่สมมติว่าดีพอคุณสามารถปรับปรุงบางอย่างได้ ขั้นแรกคุณสามารถใช้-W1เพื่อลดการหมดเวลาของการ ping เป็นหนึ่งวินาที ประการที่สองคุณสามารถทำให้สคริปต์ ping โฮสต์ต่าง ๆ แบบอะซิงโครนัส (ในเธรดพื้นหลัง) และตรวจสอบผลลัพธ์ได้ตามต้องการแทนที่จะรอ

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


โทรที่ดีในการเพิ่ม -w ต้องทำให้มันทั้งสอง แต่ทำให้คอมพิวเตอร์จำนวนมากไม่ตอบสนองเร็วพอ อาจพิจารณาเพิ่มการเช็คอินเป็นระยะเช่นกันหรือเขย่ามือ แต่ตอนนี้ต้องการมีกระบวนการที่ค่อนข้างภายนอกกับคอมพิวเตอร์ที่ฉันเปิดอยู่
Jon Phenow

1
ฉันยังใช้ - s เพื่อส่งแพ็คเก็ตขนาดเล็ก
Shawn J. Goff

3
ฉันจะตกใจถ้าส่งแพ็คเก็ตขนาดเล็กสร้างความแตกต่าง
mattdm

พวกเขาไม่ได้ถูกส่งไปแล้วที่ขนาดแพ็กเก็ตใกล้สุดหรือไม่
Jon Phenow

4
พวกมันค่อนข้างเล็ก มีค่าเริ่มต้นของข้อมูล 56 ไบต์ซึ่งคุณสามารถลดได้ แต่ในกรณีใด ๆ มันมีขนาดเล็กกว่า MTU ของอีเธอร์เน็ตและใหญ่กว่าไม่มีอะไรเลยดังนั้นมันจึงลงไปที่ "หนึ่งแพ็คเก็ต" อย่างใดอย่างหนึ่ง
mattdm

7

นี่คือสิ่งที่ fping ได้รับการออกแบบมาสำหรับ http://fping.sourceforge.net/

คุณต้องแยกวิเคราะห์ผลลัพธ์หลังจากนั้นแทนที่จะใช้รหัสส่งคืน แต่จะเร็วกว่าการทำ ping ปกติมาก


ฉันคิดว่ามันตลกดีที่คำอธิบายบอกว่า "ไม่เหมือนกับ ping fping นั้นมีไว้เพื่อใช้ในสคริปต์และเอาต์พุตของมันแยกวิเคราะห์ได้ง่าย" และยังไม่มีรหัสส่งคืน
Adam Plocher

คุณค่าที่ดีสำหรับโค้ดส่งคืนคืออะไร
Thorbjørn Ravn Andersen

3

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


ฉันไม่ได้ใช้ ethtool สำหรับสิ่งนี้คุณต้องการยกตัวอย่างหรือไม่? (หรืออาจจะเป็นลิงค์)?
Johan

ethtool {network_interface} | grep "Link detected" | cut -f 3 -d ' 'จะกลับมาyesหากเชื่อมต่อเครื่องและnoหากไม่ได้
LawrenceC

2

สิ่งที่คุณสามารถทำได้คือส่ง Ping ไปยังที่อยู่ออกอากาศซึ่งจะทำให้คอมพิวเตอร์ทุกเครื่องส่ง Ping จากนั้นคุณสามารถตรวจสอบรายการนี้เทียบกับสิ่งที่คุณมีใน SQLite เพื่อให้แน่ใจว่าคอมพิวเตอร์ทุกเครื่องมีอยู่

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


1
ฉันถือว่าคุณหมายถึง ping ที่อยู่ที่ออกอากาศไม่ใช่เกตเวย์ ในระบบที่ทันสมัยซึ่งอาจไม่ทำงาน ดูunix.stackexchange.com/questions/7458/cant-ping-broadcast
mattdm

1
@mattdm: Multicastงั้นเหรอ? ฉันไม่ทราบว่าคนส่วนใหญ่ปิดใช้งาน ฉันไม่เคยพบปัญหามาก่อน
Josh K

ฮ่าฮ่าใช่ขอบคุณ mattdm ปัญหาที่คล้ายกันที่คุณเห็นฉันวิ่งเข้าไป ไม่ใช่ว่าผู้คนจะปิดพวกเขา แต่โดยทั่วไปพวกเขามาพร้อมกับการออกอากาศเมื่อไม่นานมานี้
Jon Phenow

สามารถใช้ fping ( fping.sourceforge.net ) เพื่อ ping รายการโฮสต์ในแบบคู่ขนาน จากนั้นคุณไม่ต้องพึ่งพาความสามารถในการ ping ที่อยู่การออกอากาศ
mazianni

2

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


1
ดูเหมือนเครื่องมือเจ๋ง ๆ แต่สำหรับจุดประสงค์ของสคริปต์ตัวเล็ก ๆ นี้อาจเพิ่มบางอันที่ไม่จำเป็นลงในโปรเจค จะทำให้ตาของฉันแน่นอนแม้ว่าดูเหมือนว่าเครื่องมือที่ฉันอาจใช้ไม่ช้าไม่น้อย
Jon Phenow

0

ฉันมีปัญหาเดียวกันและเกิดสคริปต์ต่อไปนี้ (เร็ว & สกปรก) ปัญหานี้ส่งออกปิงทั้งหมดเป็นงานแยกแบบขนานและจะสแกนซับเน็ตทั้งหมด / 24 ใน 3 วินาที โปรดทราบว่าด้วยเหตุผลบางอย่างฉันไม่รำคาญที่จะพบว่าฉันไม่สามารถใช้รหัสผลการ ping ได้ที่นี่ แต่ grep -v ทำงาน:

#!/bin/bash
case $# in
1)
  case $1 in
  [1-9]*)
        echo
        echo Systems active in subnet: $1
        for (( K = 1 ; K < 255 ; K=$K+1 )); do
        # grep -v delivers 0 on no matches
                echo -ne "testing:" $1$K "...    \r"
                (if ping -c 1 -w 1 -n $1$K 2>&1 | grep -q '64 bytes' ; then
                echo $1$K alive "                "
                fi) &
        done
        sleep 3
        echo "                               "
        exit 0
        ;;
  esac;;
esac

0

ใน C

/* count = 1, wait interval = 1 second, no name lookup, */
/* 10 data bytes, 1 second timeout, 200 millisecond wait time */

sprintf(command,"ping -c1 -i1 -n -s10 -t1 -W200 %u" 
   , connection[port].IPAddress);
err = system(command);
/* err == 0 means OK */

0

ฉันพบว่าfping -r0 ...มีการตอบสนองที่รวดเร็วที่สุด

-r(ลองใหม่อีกครั้ง) ตัวเลือกที่ดูเหมือนว่าเร็วกว่าที่คล้ายกัน-c(นับ) การใช้-r0ผลลัพธ์ในการส่งปิงเพียงครั้งเดียวและผลลัพธ์จะสั้นมากเมื่อเทียบกับตัวเลือกอื่น ๆ

ในระบบของฉัน ...

fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01  2>&1

ผลลัพธ์ใน ...

LX00 is alive
LX02 is alive
HA01 is alive
ICMP Host Unreachable from 192.168.1.5 for ICMP Echo sent to LX01
PRINTER is unreachable
LX01 is unreachable
LX03 is unreachable

การนวดเล็กน้อยเพื่อกำจัดICMPข้อความให้ฉัน ...

fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01  2>&1 | grep ' is ' | sort

HA01 is alive
LX00 is alive
LX01 is unreachable
LX02 is alive
LX03 is unreachable
PRINTER is unreachable

สำหรับความเร็วนั้นfpingDual-Core รุ่นเก่าของ Intel 1.8GHz พร้อม 4GB RAM คือ ...

time fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01 2>&1

LX00 is alive
LX02 is alive
HA01 is alive
PRINTER is unreachable
LX01 is unreachable
LX03 is unreachable

real    0m0.554s
user    0m0.000s
sys     0m0.000s

และgrepและsortดูเหมือนว่าจะเพิ่ม 0.001-0.004s ในเวลา ...

time fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01 2>&1 | grep ' is ' | sort

HA01 is alive
LX00 is alive
LX01 is unreachable
LX02 is alive
LX03 is unreachable
PRINTER is unreachable

real    0m0.558s
user    0m0.000s
sys     0m0.000s

หมายเหตุ

  • ICMPข้อความไม่ได้เกิดขึ้นในทุกระยะ
  • 2>&1เป็นสิ่งที่จำเป็นเพื่อป้องกันไม่ให้ICMPข้อความจาก การแสดงขึ้นในการส่งออกในขณะที่มันจะถูกส่งไปแทนstderrstdout
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.