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


46

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

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

जवाबों:


84

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

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

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

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

ping_cancelled=false    # Keep track of whether the loop was cancelled, or succeeded
until ping -c1 "$1" >/dev/null 2>&1; 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"

यह थोड़ा घुमावदार है, लेकिन अगर आप चाहते हैं कि लूप को रद्द किया जाए तो यह चाल करना चाहिए।


6
'स्लीप' को जोड़ने के लिए (जैसे प्रत्येक 5 सेकंड): जबकि! ping -c1 www.google.com &> / dev / null; सो जाओ 5; किया
लेप

4
डिफ़ॉल्ट रूप pingसे इसके पिंग पर देने से पहले 10 सेकंड इंतजार करना होगा। यदि आप उस 1 सेकंड को कम करना चाहते हैं, तो आप उपयोग कर सकते हैं -w1
जैक ओ'कॉनर

2
@ JackO'Connor बीएसडी पिंग का उपयोग करना, यह एक राजधानी है-W1
ल्यूक एक्सटन

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

@LukeExton SashINT को हैंडल और पिंग करने के तरीकों के कारण, और वे कैसे बातचीत करते हैं ( यह सवाल देखें )। मेरे पास एक बहुत अच्छा समाधान नहीं है, लेकिन एक kluge है: स्क्रिप्ट को रोकने के लिए, kill %1इसे मारने के लिए Control-Z का उपयोग करें ।
गॉर्डन डेविसन

25

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

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

इसे अपनी स्क्रिप्ट में कहीं www.google.comरखकर ब्लॉक किया जाएगा, जब तक कि पिंगेबल न हो।


2
यह while trueऔर breakसफाई घोल, IMO है।
डैन कार्ले जूल

1
@DanCarley मैं आपसे इस कारण असहमत होने जा रहा हूं कि स्वीकृत उत्तर, अशक्त कमांड संस्करण में, एक नींद का विकल्प दे सकता है / अपने सीपीयू को विराम देने की प्रतीक्षा कर सकता है, और जिस स्थिति में मैं इसे क्लीनर समाधान कहूंगा। इस जवाब के साथ दूसरी समस्या यह है कि यह पाठक / उपयोगकर्ता को यह समझने की आवश्यकता है कि && कैसे काम करता है, और यह कि यदि पहला कमांड विफल रहता है, तो इसे कॉल नहीं किया जाएगा। यह सिर्फ एक राय है, अपने खुद की तरह।
हामिद

1
मुख्य अंतर जिसे मैं इस समाधान और स्वीकृत एक के बीच देखता हूं, वह यह है कि यह त्रुटि संदेश "अज्ञात होस्ट ..." को तब तक प्रतिध्वनित करेगा जब तक कि यह नहीं मिला। नींद जोड़ने के लिए (जैसे प्रत्येक 5 सेकंड):while true; do sleep 5; ping ...
lep

20

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

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

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

2
ठीक यही मैंने खोजा, धन्यवाद! आप CTRL + C के साथ कॉल को भी बाधित कर सकते हैं जो इस थ्रेड में कुछ अन्य समाधानों के लिए नहीं है।
एलेक्स

1
नोट करें कि यह नेटकैट के बीएसडी संस्करणों के लिए काम करता है। लिनक्स डिस्ट्रोस में nmap.org संस्करण को अलग तरीके से लागू किया गया है, इसलिए -z विकल्प मौजूद नहीं है, और -w विकल्प कनेक्शन के लिए प्रतीक्षा करता है लेकिन सफल होने पर बंद नहीं होता है। हालांकि OSX में बढ़िया काम करता है।
पॉल

यही कारण है कि आप पहले (ठीक) उत्तर पर नहीं रुकते हैं। यह असली समस्या का जवाब है।
सिंह

11

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

निम्न कोड को एक फ़ाइल के रूप में सहेजा जा सकता है और होस्टनाम के साथ तर्क के रूप में कॉल किया जा सकता है, या पहली और अंतिम पंक्ति से छीन लिया जा सकता है और मौजूदा स्क्रिप्ट (waForHost hostname) के भीतर फ़ंक्शन के रूप में उपयोग किया जाता है।

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

#!/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

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

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


4

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


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


3

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

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

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

HOST1 में h के लिए HOST2 HOST3; करना
  अगर fping -q $ h; फिर
     इको-एन "$ h:"
     ssh $ h "अनाम-ए"
  फाई
किया हुआ

1

यह दिए गए समय की संख्या की कोशिश करेगा।

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

अच्छी तरह से BSD पिंग पर SIGINT को संभालना।

HOST=google.com NO=1; while [ $NO -ne 0 ]; do ping -W1 -c1 $HOST &>/dev/null; NO=$?;echo "$(date) ($HOST) $NO" ; done; echo "$(date) ($HOST) reachable"

एक समारोह के रूप में

ping_until(){
  local NO=1
  while [ $NO -ne 0 ]; do
    ping -W1 -c1 $1 &>/dev/null; NO=$?
    # Optionally block ICMP flooding
    # sleep 1
    echo "$(date) ($1) ($NO)"
  done
}

0

मैं निम्नलिखित फ़ंक्शन का उपयोग कर रहा हूं। मुझे यह पसंद है क्योंकि मैं इसे थोड़ी देर के बाद कोशिश करना बंद करने के लिए कह सकता हूं:

#!/usr/bin/env bash

function networkup {
  # Initialize number of attempts
  reachable=$1
  while [ $reachable -ne 0 ]; do
    # Ping supplied host
    ping -q -c 1 -W 1 "$2" > /dev/null 2>&1
    # Check return code
    if [ $? -eq 0 ]; then
      # Success, we can exit with the right return code
      echo 0
      return
    fi
    # Network down, decrement counter and try again
    let reachable-=1
    # Sleep for one second
    sleep 1
  done
  # Network down, number of attempts exhausted, quiting
  echo 1
}

इसका उपयोग कुछ लॉन्च करने के लिए इस तरह किया जा सकता है:

# Start-up a web browser, if network is up
if [ $(networkup 60 www.google.com) -eq 0 ]; then
  firefox &
fi

0

सामान्य तौर पर मैं अपने डेटाबेस या अन्य सर्वर के आने का इंतजार करना चाहता हूं, लेकिन मैं बहुत लंबा इंतजार नहीं करना चाहता । निम्न कोड 10 सेकंड के लिए प्रतीक्षा करता है, फिर सर्वर से समय सीमा के भीतर प्रकट नहीं होने पर निकास कोड सेट करता है।

यदि सर्वर समय सीमा से पहले दिखाई देता है, तो लूप शॉर्ट-सर्कुलेट किया जाएगा, ताकि कोड का अगला भाग चल सके।

for i in `seq 1 10`; do date ; sleep 1 ; ping -c1 ${HOST} &>/dev/null && break ; done

0

गॉर्डन डेविसन के जवाब में एक और वृद्धि:

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

आसपास के '$' (') के साथ एक सबशेल शुरू हो गया है और इसलिए आप कंट्रोल-सी का उपयोग उस घटना में लूप को समाप्त करने के लिए कर सकते हैं जो होस्ट उपलब्ध नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.