बैश में एक लूप कैसे बनाएं जो एक वेबसर्वर के जवाब की प्रतीक्षा कर रहा है?


104

बैश में एक लूप कैसे बनाएं जो एक वेबसर्वर के जवाब की प्रतीक्षा कर रहा है?

इसे एक "प्रिंट करना चाहिए।" प्रत्येक 10 सेकंड या तो, और जब तक सर्वर प्रतिक्रिया शुरू नहीं करता तब तक प्रतीक्षा करें।

यदि मुझे सर्वर से अच्छी प्रतिक्रिया मिलती है, तो यह कोड परीक्षण करता है।

अगर कर्ल --आउटपुट / देव / अशक्त - शील - सिर - फेल "$ url"; फिर
  इको "URL मौजूद है: $ url"
अन्य
  इको "URL मौजूद नहीं है: $ url"
फाई

क्या आप इस बात के बारे में अधिक विशिष्ट हो सकते हैं कि आप सर्वर के जवाब की प्रतीक्षा कैसे कर रहे हैं?
chepner

मैं इस बात पर विचार करूंगा कि सर्वर तैयार नहीं है, जब तक कि वह उत्तर नहीं देता है या यह 200 की प्रतिक्रिया से अलग कुछ के साथ उत्तर देता है।
सोरिन

जवाबों:


170

प्रश्न का उत्तर देने वाले के साथ, यह मेरे लिए काम कर रहा है:

until $(curl --output /dev/null --silent --head --fail http://myhost:myport); do
    printf '.'
    sleep 5
done

10
बैकटिक्स `` का उपयोग पुराना है$( )इसके बजाय उपयोग करें ।
सर्ज स्ट्रोबंड्ट

6
देने से पहले अधिकतम प्रतीक्षा समय की अनुमति देने के लिए एक महान विस्तार होगा
tkruse

आपको एक की आवश्यकता क्यों है --head?
lexicore

3
@lexicore चूंकि शरीर इस आदेश के लिए दिलचस्प नहीं है, हम केवल सिर का अनुरोध करते हैं (हालांकि आप सर्वर की स्थिति के बारे में अधिक सामान की जांच करने के लिए तर्क शामिल कर सकते हैं)। बाहर जाने से --headकुछ भी नहीं बदलेगा, लेकिन आप प्रतिक्रिया सामग्री पर कुछ तर्क का प्रयोग करना चाहते हैं (जैसे स्थिति html)।
थॉमस फेरिस निकोलाइसेन

1
मेरे पास एक विशिष्ट मामला था, जहां --headहमेशा लौटकर उपयोग किया जाता था 405। इसे काम करने के लिए इसे हटाना पड़ा
रॉन हैर्लेव

38

मैं अधिकतम प्रयासों को सीमित करना चाहता था। थॉमस के स्वीकृत उत्तर के आधार पर मैंने इसे बनाया:

attempt_counter=0
max_attempts=5

until $(curl --output /dev/null --silent --head --fail http://myhost:myport); do
    if [ ${attempt_counter} -eq ${max_attempts} ];then
      echo "Max attempts reached"
      exit 1
    fi

    printf '.'
    attempt_counter=$(($attempt_counter+1))
    sleep 5
done

मैं जोड़ने का सुझाव देता हूं कि --max-time 5अगर कुछ कारणों से लिंक टाइम के लिए अनुरोध किया गया है
Enigo

16

इसके लिए httping अच्छा है। सरल, स्वच्छ, शांत।

while ! httping -qc1 http://myhost:myport ; do sleep 1 ; done

जबकि / जब तक आदि एक व्यक्तिगत शिकार है।


2
दूसरे विचारों पर, हमेशा के लिए एक लंबा समय है ... for i in seq 60; do httping -qc1 http://myhost:myport && echo && break sleep 5 echo -n ${i}.. done
ब्रूस एज


0

दिलचस्प पहेली। यदि आपके पास अपने क्लाइंट के साथ कोई एक्सेस या एस्क्स्ट एपी नहीं है, तो आप इस तरह से अपने tcp सॉकेट को ट्राई कर सकते हैं:

until grep '***IPV4 ADDRESS OF SERVER IN REVERSE HEX***' /proc/net/tcp
do
  printf '.'
  sleep 1
done

लेकिन यह 1 सेकंड के अंतराल के साथ एक व्यस्त प्रतीक्षा है। आप शायद उससे अधिक संकल्प चाहते हैं। यह भी वैश्विक है। यदि उस सर्वर से कोई अन्य कनेक्शन किया जाता है, तो आपके परिणाम अमान्य हैं।


-1

यदि आपको जाँच की आवश्यकता है कि क्या सर्वर उपलब्ध है, कारण फिर से शुरू हो रहा है या कुछ और है, तो आप सर्वर पर एक वाइज़ बनाने की कोशिश कर सकते हैं और प्रतिक्रिया या त्रुटि को पार्स कर सकते हैं, यदि आपको 200 या 404 तक सर्वर मिलता है, तो आप WIME टाइमआउट को --timeout = सेकंड के साथ बदल सकते हैं, आप 10 सेकंड के लिए टाइमआउट सेट कर सकते हैं और जब तक कि प्रतिक्रिया का एक परिणाम न हो जाए, तब तक लूप बना सकते हैं।

मुझे नहीं पता कि यह वही है जो आप खोज रहे हैं या वास्तव में आपको बैश कोड की आवश्यकता है।

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