शेल कमांड / स्क्रिप्ट यह देखने के लिए कि क्या कोई होस्ट जीवित है?


9

मैं यह देखने के लिए और अधिक तरीके जानने की कोशिश कर रहा हूं कि क्या एक दिया गया मेजबान ऊपर है, केवल शेल कमांड (मुख्य रूप से बैश) का उपयोग कर रहा है। आदर्श रूप से, यह होस्टनाम और आईपी पते दोनों के साथ काम करने में सक्षम होगा। अभी मेरा एकमात्र देशी तरीका है जो पिंग है, शायद एक स्क्रिप्ट में एकीकृत किया गया है जैसा कि यहां वर्णित है। कोई अन्य विचार?

जवाबों:


7

ping है परीक्षण करने के लिए जिस तरह से है कि क्या एक मेजबान जीवित है और जुड़ा हुआ है। (यदि कोई होस्ट जीवित है, लेकिन प्रतिक्रिया देने के लिए डिस्कनेक्ट या धीमा है, तो आप उसे मृत होने से अलग नहीं कर सकते।)

pingकमांड द्वारा समर्थित विकल्प सिस्टम से सिस्टम में भिन्न होते हैं। आप यह सुनिश्चित करना चाहते हैं कि यह हमेशा के लिए लूप न करे, लेकिन कुछ सेकंड के बाद वापस लौट आए, अगर उसे कोई उत्तर नहीं मिला।

FreeBSD और Linux iputils के साथ, ping -c 1 -W 1 >/dev/nullएक सिंगल पिंग भेजता है और 1 सेकंड प्रतीक्षा करता है। आपको आउटपुट को पार्स करने की आवश्यकता नहीं है: कमांड 0 देता है यदि इसे पिंग बैक और नॉनज़रो अन्यथा प्राप्त हुआ है (अज्ञात होस्ट नाम, होस्ट करने का कोई मार्ग नहीं, कोई उत्तर नहीं)। कुछ कार्यान्वयन के लिए अलग-अलग झंडे की आवश्यकता हो सकती है (उदाहरण -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

मैं जानता हूँ कि यह जिस तरह से, मैं सिर्फ उम्मीद कर रही थी यह एक ही रास्ता नहीं था, भले ही अन्य तरीकों से अजीब या चंचल हैं या आप क्या कर सकते है। ओह अच्छा!
user67459

2
इस उत्तर को उत्तर के रूप में चिह्नित नहीं किया जाना चाहिए answered। ओपी ने विशेष रूप 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."
1111161171159459134

@ 1111161171159459134 यह पैराग्राफ बेहतर शब्द हो सकता था। यह अत्यधिक चिंताजनक है। आपको बहुत अधिक दर के साथ पिंग या पिंग नहीं करना चाहिए, लेकिन एक पिंग पैकेट अब और फिर नगण्य है।
गिल्स का SO-

2

पिंग महान है कि मेजबान नेटवर्क से जुड़ा है या नहीं, इस बारे में त्वरित प्रतिक्रिया प्राप्त करने के लिए बहुत अच्छा है, लेकिन यह अक्सर आपको यह नहीं बताएगा कि मेजबान जीवित है या नहीं, या क्या यह अभी भी उम्मीद के मुताबिक काम कर रहा है। ऐसा इसलिए है क्योंकि आमतौर पर पिंग प्रतिक्रियाओं को कर्नेल द्वारा नियंत्रित किया जाता है, इसलिए भले ही सिस्टम का प्रत्येक एप्लिकेशन क्रैश हो गया हो (जैसे डिस्क में खराबी या मेमोरी से बाहर चलने के कारण), आपको अक्सर पिंग प्रतिक्रियाएं मिलेंगी और मशीन मान सकती है। जब स्थिति काफी विपरीत होती है तो सामान्य रूप से संचालन होता है।

जाँच सेवाएँ

आमतौर पर आप वास्तव में परवाह नहीं करते हैं कि एक मेजबान अभी भी ऑनलाइन है या नहीं, क्या आप वास्तव में परवाह करते हैं कि क्या मशीन अभी भी कुछ कार्य कर रही है। इसलिए यदि आप सीधे कार्य की जांच कर सकते हैं तो आपको पता चल जाएगा कि मेजबान दोनों तैयार है और यह कार्य अभी भी चल रहा है।

उदाहरण के लिए वेब सर्वर चलाने वाले दूरस्थ होस्ट के लिए, आप कुछ इस तरह से कर सकते हैं:

# 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लक्ष्य को सुनिश्चित करने के लिए सेवा चालू रखी जाती है, लेकिन यह उन लिपियों में उपयोगी है जहां आप केवल मशीन ए पर कुछ कार्य करना चाहते हैं जब तक मशीन बी इसके लिए तैयार है। ।

यह जाँचने जैसा कुछ हो सकता है कि टारगेट मशीन के पास एक निश्चित फाइल सिस्टम 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

बिना क्लाइंट वाली सेवाएं

कभी-कभी सेवा से जुड़ने का कोई आसान तरीका नहीं होता है और आप बस यह देखना चाहते हैं कि यह आने वाले टीसीपी कनेक्शन को स्वीकार करता है या नहीं, लेकिन जब आप telnetपोर्ट पर लक्ष्य पर सवाल उठाते हैं तो यह वहीं बैठ जाता है और आपको डिस्कनेक्ट नहीं करता है, जिसका अर्थ है कि ऐसा करना एक स्क्रिप्ट में यह लटका हुआ होगा।

जबकि इतना साफ नहीं है, आप अभी भी timeoutऔर netcatकार्यक्रमों की मदद से ऐसा कर सकते हैं। उदाहरण के लिए यह देखने के लिए कि क्या मशीन TCP पोर्ट 445 पर SMB / CIFS कनेक्शन स्वीकार करती है, इसलिए आप देख सकते हैं कि क्या यह 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.