ฉันกำลังพยายามหาวิธีเพิ่มเติมเพื่อดูว่าโฮสต์ที่กำหนดนั้นใช้งานได้หรือไม่โดยใช้คำสั่งเชลล์ เป็นการดีที่มันจะสามารถทำงานกับทั้งชื่อโฮสต์และที่อยู่ IP ตอนนี้วิธีเดียวที่ฉันรู้คือ ping อาจรวมเข้ากับสคริปต์ตามที่อธิบายไว้ที่นี่ ความคิดอื่น ๆ ?
ฉันกำลังพยายามหาวิธีเพิ่มเติมเพื่อดูว่าโฮสต์ที่กำหนดนั้นใช้งานได้หรือไม่โดยใช้คำสั่งเชลล์ เป็นการดีที่มันจะสามารถทำงานกับทั้งชื่อโฮสต์และที่อยู่ IP ตอนนี้วิธีเดียวที่ฉันรู้คือ ping อาจรวมเข้ากับสคริปต์ตามที่อธิบายไว้ที่นี่ ความคิดอื่น ๆ ?
คำตอบ:
ping เป็นวิธีการทดสอบว่าโฮสต์ยังมีชีวิตอยู่และเชื่อมต่อกันหรือไม่ (หากโฮสต์ยังมีชีวิตอยู่ แต่ตัดการเชื่อมต่อหรือตอบสนองช้าคุณจะไม่สามารถแยกแยะได้ว่ามันตายไปแล้ว)
ตัวเลือกที่รองรับโดยpingคำสั่งนั้นแตกต่างกันไปในแต่ละระบบ คุณจะต้องแน่ใจว่ามันไม่วนซ้ำตลอดไป แต่จะกลับมาหลังจากสองสามวินาทีหากไม่ได้รับคำตอบ
ด้วย FreeBSD และ iputils Linux ping -c 1 -W 1 >/dev/nullส่ง ping เดียวและรอ 1 วินาที คุณไม่จำเป็นต้องแยกวิเคราะห์เอาต์พุต: คำสั่งส่งคืน 0 หากได้รับการ ping กลับและไม่ใช่ศูนย์มิฉะนั้น (ชื่อโฮสต์ที่ไม่รู้จักไม่มีเส้นทางไปยังโฮสต์ไม่มีการตอบกลับ) การใช้งานบางอย่างอาจต้องการแฟล็กที่แตกต่างกัน (เช่น-wแทนที่จะเป็น-WFreeBSD) ตรวจสอบคู่มือในระบบ
if ping -c 1 -W 1 "$hostname_or_ip_address"; then
echo "$hostname_or_ip_address is alive"
else
echo "$hostname_or_ip_address is pining for the fjords"
fi
answeredคำตอบ OP ขอเฉพาะmore ways to see if a given host is upนอกเหนือจากpingซึ่งคำตอบนี้ไม่ได้ให้
"Because of the load it can impose on the network, it is unwise to use ping during normal operations or from automated scripts."
Ping นั้นยอดเยี่ยมในการรับการตอบสนองอย่างรวดเร็วว่าโฮสต์นั้นเชื่อมต่อกับเครือข่ายหรือไม่ แต่มักจะไม่บอกคุณว่าโฮสต์นั้นยังมีชีวิตอยู่หรือไม่หรือว่ายังทำงานอยู่ตามที่คาดไว้ นี่เป็นเพราะเคอร์เนลจัดการการตอบสนองโดยทั่วไปดังนั้นแม้ว่าแอปพลิเคชันทั้งหมดในระบบจะล้มเหลว (เช่นเนื่องจากดิสก์ล้มเหลวหรือหน่วยความจำไม่เพียงพอ) คุณจะยังได้รับการตอบสนองปิงและอาจถือว่าเครื่องเป็น ดำเนินงานตามปกติเมื่อสถานการณ์ค่อนข้างตรงกันข้าม
โดยปกติแล้วคุณไม่สนใจว่าโฮสต์ยังคงออนไลน์อยู่หรือไม่สิ่งที่คุณสนใจจริงๆก็คือว่าเครื่องยังคงทำงานบางอย่างอยู่หรือไม่ ดังนั้นหากคุณสามารถตรวจสอบงานได้โดยตรงคุณจะรู้ว่าโฮสต์นั้นทำงานแล้วและยังทำงานอยู่
สำหรับรีโมตโฮสต์ที่รันเว็บเซิร์ฟเวอร์ตัวอย่างเช่นคุณสามารถทำสิ่งนี้:
# Add the -f option to curl if server errors like HTTP 404 should fail too
if curl -I "http://$TARGET"; then
echo "$TARGET alive and web site is up"
else
echo "$TARGET offline or web server problem"
fi
หากใช้ SSH และคุณมีการตั้งค่าคีย์สำหรับการเข้าสู่ระบบแบบไม่ใช้รหัสผ่านแสดงว่าคุณมีตัวเลือกเพิ่มอีกสองสามตัวอย่างเช่น:
if ssh "$TARGET" true; then
echo "$TARGET alive and accessible via SSH"
else
echo "$TARGET offline or not accepting SSH logins"
fi
SSH'ing ทำงานในโฮสต์และรันtrueคำสั่งจากนั้นปิดการเชื่อมต่อ sshคำสั่งเพียง แต่จะกลับมาประสบความสำเร็จถ้าคำสั่งที่สามารถทำงานได้สำเร็จ
คุณสามารถขยายสิ่งนี้เพื่อตรวจสอบกระบวนการเฉพาะเช่นการทำให้แน่ใจว่าmysqldกำลังทำงานอยู่บนเครื่อง:
if ssh "$TARGET" bash -c 'ps aux | grep -q mysqld'; then
echo "$TARGET alive and running MySQL"
else
echo "$TARGET offline or MySQL crashed"
fi
แน่นอนในกรณีนี้คุณควรทำงานได้ดีกว่าmonitในเป้าหมายเพื่อให้แน่ใจว่าบริการยังคงทำงานอยู่ แต่มีประโยชน์ในสคริปต์ที่คุณต้องการทำงานบางอย่างบนเครื่อง A ตราบใดที่เครื่อง B พร้อมใช้งาน .
นี่อาจเป็นบางสิ่งบางอย่างเช่นการตรวจสอบว่าเครื่องเป้าหมายติดตั้งระบบไฟล์บางตัวก่อนที่จะทำการติดตั้งrsyncเพื่อให้คุณไม่ได้เติมดิสก์หลักโดยไม่ตั้งใจหากระบบไฟล์รองไม่ได้เมาต์ด้วยเหตุผลบางประการ ตัวอย่างเช่นนี้จะทำให้แน่ใจว่า/mnt/raidติดตั้งบนเครื่องเป้าหมายก่อนดำเนินการต่อ
if ssh "$TARGET" bash -c 'mount | grep -q /mnt/raid'; then
echo "$TARGET alive and filesystem ready to receive data"
else
echo "$TARGET offline or filesystem not mounted"
fi
บางครั้งไม่มีวิธีที่ง่ายในการเชื่อมต่อกับบริการและคุณเพียงแค่ต้องการดูว่ามันยอมรับการเชื่อมต่อ TCP ขาเข้าหรือไม่ แต่เมื่อคุณtelnetไปถึงเป้าหมายที่พอร์ตที่มีปัญหาคำถามนี้จะอยู่ที่นั่นและไม่ได้ตัดการเชื่อมต่อคุณ ในสคริปต์จะทำให้มันแขวน
แม้ว่าจะไม่ค่อยสะอาดเท่าไหร่คุณยังสามารถทำสิ่งนี้ได้ด้วยความช่วยเหลือของtimeoutและnetcatโปรแกรมต่างๆ ตัวอย่างเช่นนี้จะตรวจสอบว่าเครื่องยอมรับการเชื่อมต่อ SMB / CIFS บนพอร์ต TCP 445 หรือไม่ดังนั้นคุณสามารถดูได้ว่ากำลังรันการแชร์ไฟล์ Windows แม้ว่าคุณจะไม่มีรหัสผ่านเพื่อเข้าสู่ระบบหรือเครื่องมือไคลเอนต์ CIFS ไม่ได้ทำงาน ' ติดตั้งที:
# Wait 1 second to connect (-w 1) and if the total time (DNS lookups + connect
# time) reaches 5 seconds, assume the connection was successful and the remote
# host is waiting for us to send data. Connecting on TCP port 445.
if echo 'x' | timeout --preserve-status 5 nc -w 1 "$TARGET" 445; then
echo "$TARGET alive and CIFS service available"
else
echo "$TARGET offline or CIFS unavailable"
fi