ฉันกำลังพยายามหาวิธีเพิ่มเติมเพื่อดูว่าโฮสต์ที่กำหนดนั้นใช้งานได้หรือไม่โดยใช้คำสั่งเชลล์ เป็นการดีที่มันจะสามารถทำงานกับทั้งชื่อโฮสต์และที่อยู่ IP ตอนนี้วิธีเดียวที่ฉันรู้คือ ping อาจรวมเข้ากับสคริปต์ตามที่อธิบายไว้ที่นี่ ความคิดอื่น ๆ ?
ฉันกำลังพยายามหาวิธีเพิ่มเติมเพื่อดูว่าโฮสต์ที่กำหนดนั้นใช้งานได้หรือไม่โดยใช้คำสั่งเชลล์ เป็นการดีที่มันจะสามารถทำงานกับทั้งชื่อโฮสต์และที่อยู่ IP ตอนนี้วิธีเดียวที่ฉันรู้คือ ping อาจรวมเข้ากับสคริปต์ตามที่อธิบายไว้ที่นี่ ความคิดอื่น ๆ ?
คำตอบ:
ping
เป็นวิธีการทดสอบว่าโฮสต์ยังมีชีวิตอยู่และเชื่อมต่อกันหรือไม่ (หากโฮสต์ยังมีชีวิตอยู่ แต่ตัดการเชื่อมต่อหรือตอบสนองช้าคุณจะไม่สามารถแยกแยะได้ว่ามันตายไปแล้ว)
ตัวเลือกที่รองรับโดยping
คำสั่งนั้นแตกต่างกันไปในแต่ละระบบ คุณจะต้องแน่ใจว่ามันไม่วนซ้ำตลอดไป แต่จะกลับมาหลังจากสองสามวินาทีหากไม่ได้รับคำตอบ
ด้วย FreeBSD และ iputils Linux ping -c 1 -W 1 >/dev/null
ส่ง ping เดียวและรอ 1 วินาที คุณไม่จำเป็นต้องแยกวิเคราะห์เอาต์พุต: คำสั่งส่งคืน 0 หากได้รับการ ping กลับและไม่ใช่ศูนย์มิฉะนั้น (ชื่อโฮสต์ที่ไม่รู้จักไม่มีเส้นทางไปยังโฮสต์ไม่มีการตอบกลับ) การใช้งานบางอย่างอาจต้องการแฟล็กที่แตกต่างกัน (เช่น-w
แทนที่จะเป็น-W
FreeBSD) ตรวจสอบคู่มือในระบบ
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