सवाल मेजबान ज्ञात होने तक लिनक्स में पिंग कैसे करें?


मैं एक निश्चित पता कैसे पिंग कर सकता हूं और जब पाया जाता है, तो पिंगिंग रोकें।

मैं इसे एक बैश स्क्रिप्ट में उपयोग करना चाहता हूं, इसलिए जब होस्ट शुरू हो रहा है, तो स्क्रिप्ट पिंगिंग पर रहता है और उस समय से होस्ट उपलब्ध है, स्क्रिप्ट जारी है ...


42
2017-07-17 07:45


मूल




जवाब:


मार्टिनस के उत्तर का एक और सरलीकरण:

until ping -c1 www.google.com &>/dev/null; do :; done

ध्यान दें कि पिंग स्वयं लूप परीक्षण के रूप में प्रयोग किया जाता है; जैसे ही यह सफल होता है, लूप समाप्त होता है। लूप बॉडी खाली है, नल कमांड के साथ ":"एक वाक्यविन्यास त्रुटि को रोकने के लिए प्रयोग किया जाता है।

अपडेट: मैंने कंट्रोल-सी को पिंग लूप से साफ़ रूप से बाहर निकलने का तरीका बताया। यह पृष्ठभूमि में लूप चलाएगा, इंटरप्ट (कंट्रोल-सी) सिग्नल को फंस जाएगा, और अगर ऐसा होता है तो पृष्ठभूमि लूप को मार दें:

ping_cancelled=false    # Keep track of whether the loop was cancelled, or succeeded
until ping -c1 "$1" &>/dev/null; do :; done &    # The "&" backgrounds it
trap "kill $!; ping_cancelled=true" SIGINT
wait $!          # Wait for the loop to exit, one way or another
trap - SIGINT    # Remove the trap, now we're done with it
echo "Done pinging, cancelled=$ping_cancelled"

यह थोड़ा सर्किट है, लेकिन यदि आप लूप को रद्द करने योग्य बनाना चाहते हैं तो उसे चाल चलनी चाहिए।


77
2017-07-17 23:16



'नींद' जोड़ने के लिए (उदा। प्रत्येक 5 सेकेंड): जबकि! पिंग-सी 1 www.google.com और> / dev / null; नींद 5 करो; किया हुआ - lepe
उत्तम! मैक ओएसएक्स पर भी काम करता है। - Bart Kummel
डिफ़ॉल्ट रूप से ping अपने पिंग पर छोड़ने से पहले 10 सेकंड इंतजार करेंगे। यदि आप इसे 1 सेकंड तक कम करना चाहते हैं, तो आप इसका उपयोग कर सकते हैं -w1। - Jack O'Connor
बीएसडी पिंग का उपयोग करते हुए @ जैको 'कॉनर, यह एक राजधानी है -W1 - Luke Exton
इस जवाब के साथ मेरा एकमात्र मुद्दा यह है कि यह सिगिनट को अच्छी तरह से संभाल नहीं लेता है। आप कमांड लाइन से इसे रोकने में असमर्थ हैं, अगर यह किसी भी कारण से कनेक्ट नहीं होगा। - Luke Exton


आप एक लूप कर सकते हैं, एक पिंग भेज सकते हैं और स्थिति के आधार पर लूप को तोड़ सकते हैं, उदाहरण के लिए (बैश):

while true; do ping -c1 www.google.com > /dev/null && break; done

इसे अपनी स्क्रिप्ट में कहीं भी रखकर, अवरुद्ध कर दिया जाएगा www.google.com पिंगेबल है


22
2017-07-17 08:01



इस while true तथा break क्लीनर समाधान, आईएमओ है। - Dan Carley
@DanCarley मैं इस कारण से असहमत होने जा रहा हूं कि स्वीकृत उत्तर में, शून्य कमांड संस्करण में, कोई आपके सीपीयू को ब्रेक देने के लिए नींद / प्रतीक्षा कर सकता है, और इस मामले में मैं इसे क्लीनर समाधान कहूंगा। इस उत्तर के साथ दूसरी समस्या यह है कि पाठक / उपयोगकर्ता को यह समझने की आवश्यकता होती है कि && कैसे काम करता है, और यदि पहला आदेश विफल रहता है, तो उसे नहीं कहा जाएगा। यह सिर्फ एक राय है, जैसा कि आप स्वयं की तरह है। - Hamid
इस समाधान और स्वीकृत एक के बीच मैं जो मुख्य अंतर देखता हूं, वह यह है कि यह त्रुटि संदेश "अज्ञात होस्ट ..." को तब तक गूंज देगा जब तक कि यह नहीं मिला। जोड़ने के लिए नींद (उदाहरण के लिए प्रत्येक 5 सेकंड): while true; do sleep 5; ping ... - lepe


मुझे पता है कि सवाल पुराना है ... और विशेष रूप से पूछता है ping, लेकिन मैं अपना समाधान साझा करना चाहता था।

जब मैं एसएसएच को दोबारा वापस कर सकता हूं तो यह पता लगाने के लिए मेजबान रिबूट करते समय मैं इसका उपयोग करता हूं। (जबसे ping पहले कई सेकंड के लिए जवाब देंगे sshd शुरू हो गया।)

until nc -vzw 2 $host 22; do sleep 2; done

17
2017-10-11 14:37



यही वही है जो मैंने खोजा, धन्यवाद! आप CTRL + C के साथ कॉल को बाधित भी कर सकते हैं जो इस थ्रेड में कुछ अन्य समाधानों का मामला नहीं है। - Alex
नोट यह नेटकैट के बीएसडी संस्करणों के लिए काम करता है। लिनक्स डिस्ट्रोज़ में nmap.org संस्करण अलग-अलग कार्यान्वित किया गया है, इसलिए -z विकल्प मौजूद नहीं है, और -w विकल्प कनेक्शन के लिए इंतजार कर रहा है लेकिन सफल होने पर बंद नहीं होता है। हालांकि, ओएसएक्स में बहुत अच्छा काम करता है। - Paul


एक बार लक्ष्य मेजबान पिंग। जांचें कि क्या पिंग सफल हुआ है (पिंग का रिटर्न वैल्यू शून्य है)। यदि मेजबान जीवित नहीं है, तो फिर से पिंग करें।

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

कोड विफल होने के कारण का मूल्यांकन नहीं करता है अगर पिंग प्रतिक्रिया का नतीजा नहीं देता है, इस प्रकार मेजबान मौजूद नहीं होने पर हमेशा के लिए लूपिंग करता है। मेरा बीएसडी मैनपेज प्रत्येक रिटर्न वैल्यू का अर्थ सूचीबद्ध करता है, जबकि लिनक्स कोई नहीं करता है, इसलिए मुझे लगता है कि यह पोर्टेबल नहीं हो सकता है, इसलिए मैंने इसे छोड़ दिया।

#!/bin/bash

PING=`which ping`

function waitForHost
{
    if [ -n "$1" ]; 
    then
        waitForHost1 $1;
    else
        echo "waitForHost: Hostname argument expected"
    fi
}

function waitForHost1
{
    reachable=0;
    while [ $reachable -eq 0 ];
    do
    $PING -q -c 1 $1
    if [ "$?" -eq 0 ];
    then
        reachable=1
    fi
    done
    sleep 5
}
waitForHost $1

11
2017-07-17 07:58





UNREACHEABLE=1;
while [ $UNREACHEABLE -ne "0" ]; 
   do ping -q -c 1 HOST &> /dev/null; UNREACHEABLE=$?; sleep 1;
done

आप नींद 1 को हटा सकते हैं, यह केवल यहां है कि किसी भी बाढ़ की समस्या को रोकने के लिए जहां मेजबान पुन: प्रयोज्य होगा लेकिन पिंग कोड 0 से बाहर नहीं निकल जाएगी।


9
2017-07-17 08:09





कृपया अच्छे विकल्प देखें स्टैक ओवरफ़्लो। यहां बैश में एक नमूना है, आपको निम्न कोड पर लूप करना होगा जब तक कि यह सफल पिंग परिणाम न लौटाए।


ping -c 1 -t 1 192.168.1.1;
if [ $? -eq 0 ]; then
    echo "192.168.1.1 is up";
else 
    echo "ip is down";
fi


4
2017-07-17 08:00





उपर्युक्त लूपों में से किसी भी को पिंग के बजाए फिंगिंग के साथ भी इस्तेमाल किया जा सकता है, जो आईएमओ पिंग की तुलना में स्क्रिप्ट में उपयोग के लिए बेहतर है। देख fping (1) ब्योरा हेतु।

while ! fping -q $HOSTNAMES ; do :; done

परीक्षण करने के लिए भी उपयोगी है अगर मशीनें उन पर कुछ करने से पहले हैं। एक साधारण उदाहरण:

HOST1 HOST2 HOST3 में एच के लिए; करना
  अगर fping -q $ एच; फिर
     echo -n "$ एच:"
     एसएसएच $ एच "uname -a"
  फाई
किया हुआ

3
2017-07-18 23:25





यह एक निश्चित संख्या का प्रयास करेगा।

t=4; c=0; r=0; until ping -c 1 hostname.com >/dev/null 2>&1 || ((++c >= t)); do r=$?; done; echo $r

गूंजने के बजाय $r, आप इसका परीक्षण कर सकते हैं और इसके मूल्य के अनुसार कार्य कर सकते हैं:

if ((r)); then echo 'Failed to contact host'; else echo 'Continuing with script'; fi

1
2018-06-26 02:06