คำสั่งเชลล์ / สคริปต์เพื่อดูว่าโฮสต์ยังมีชีวิตอยู่หรือไม่?


9

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

คำตอบ:


7

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

ฉันรู้ว่ามันทางผมก็แค่หวังว่ามันไม่ได้เป็นวิธีเดียวที่แม้ว่าวิธีการอื่น ๆ ที่มีแปลกหรือไม่แน่นอนหรือสิ่งที่มีคุณ โอ้ดี!
67459

2
คำตอบนี้ไม่ควรถูกทำเครื่องหมายเป็นansweredคำตอบ OP ขอเฉพาะmore ways to see if a given host is upนอกเหนือจากpingซึ่งคำตอบนี้ไม่ได้ให้
Yokai

จากหน้า man 'ping':"Because of the load it can impose on the network, it is unwise to use ping during normal operations or from automated scripts."
1111161171159459134

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

2

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คำสั่งเพียง แต่จะกลับมาประสบความสำเร็จถ้าคำสั่งที่สามารถทำงานได้สำเร็จ

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