http - रगत - सतत व्यापक मूल्यांकन की विशेषता




बैश/खोल स्क्रिप्ट से http प्रतिक्रिया कोड का मूल्यांकन कैसे करें? (7)

मुझे लगता है कि मुझे स्पष्ट याद आ रहा है, लेकिन man [curl|wget] या google ("http" इस तरह की एक खराब खोज शब्द बनाता है) के साथ सफल नहीं हुआ है। मैं अपने वेबसर्वर में से एक को त्वरित और गंदे फिक्स की तलाश में हूं जो अक्सर विफल रहता है, एक त्रुटि संदेश के साथ स्थिति कोड 500 लौटाता है। एक बार ऐसा होने पर, इसे पुनरारंभ करने की आवश्यकता होती है।

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

प्रस्तावित समाधान एक क्रॉन नौकरी बनाना है जो हर 5 मिनट में चलता है, http://localhost:8080/ । यदि यह स्टेटस कोड 500 के साथ आता है, तो वेबसर्वर पुनरारंभ होगा। सर्वर एक मिनट से कम समय में पुनरारंभ होगा, इसलिए पहले से चलने वाले पुनरारंभ की जांच करने की आवश्यकता नहीं है।

प्रश्न में सर्वर एक उबंटू 8.04 न्यूनतम स्थापना है जो वर्तमान में आवश्यकतानुसार चलाने के लिए पर्याप्त संकुल के साथ स्थापित है। कार्य को बाश में करने की कोई कठोर आवश्यकता नहीं है, लेकिन मैं इसे और अधिक दुभाषिया स्थापित किए बिना कम से कम वातावरण में चलाने के लिए चाहता हूं।

(मैं स्क्रिप्टिंग के साथ पर्याप्त रूप से परिचित हूं कि एक पर्यावरण परिवर्तक को http स्थिति कोड असाइन करने के लिए आदेश / विकल्प पर्याप्त होंगे - यही वह है जिसे मैंने देखा है और नहीं मिला।)


ऊपर @DennisWilliamson टिप्पणी जोड़ने के लिए:

@ वैभव बाजपाई: इसे आज़माएं: प्रतिक्रिया = $ (कर्ल - लिखना-बाहर \ n% {http_code} --silent --output - servername) - परिणाम में अंतिम पंक्ति प्रतिक्रिया कोड होगी

फिर आप निम्न की तरह कुछ का उपयोग कर प्रतिक्रिया से प्रतिक्रिया कोड को पार्स कर सकते हैं, जहां एक्स प्रतिक्रिया के अंत को चिह्नित करने के लिए रेगेक्स को इंगित कर सकता है (यहां एक जेसन उदाहरण का उपयोग करके)

X='*\}'
code=$(echo ${response##$X})

सबस्ट्रिंग रिमूवल देखें: http://tldp.org/LDP/abs/html/string-manipulation.html


एक और बदलाव:

status=$(curl -I https://www.healthdata.gov/user/login 2> /dev/null | head -n 1 | cut -d ' ' -f 2)

मुझे आज कुछ जल्दी डेमो करने की जरूरत थी और इसके साथ आया। सोचा कि अगर मैं ओपी के अनुरोध के समान कुछ चाहिए तो मैं इसे यहां रखूंगा।

#!/bin/bash

status_code=$(curl --write-out %{http_code} --silent --output /dev/null www.bbc.co.uk/news)

if [[ "$status_code" -ne 200 ]] ; then
  echo "Site status changed to $status_code" | mail -s "SITE STATUS CHECKER" "[email protected]" -r "STATUS_CHECKER"
else
  exit 0
fi

यह 200 से प्रत्येक राज्य परिवर्तन पर एक ईमेल अलर्ट भेजेगा, इसलिए यह गूंगा और संभावित लालची है। इसे बेहतर बनाने के लिए, मैं कई स्टेटस कोडों के माध्यम से लूपिंग और परिणाम पर निर्भर विभिन्न क्रियाएं करने के लिए देखता हूं।


मैंने 500 कोड पर इसका परीक्षण नहीं किया है, लेकिन यह 200, 302 और 404 जैसे अन्य लोगों पर काम करता है।

response=$(curl --write-out %{http_code} --silent --output /dev/null servername)

यहाँ लंबे समय तक चलने वाला है - अभी तक समझने में आसान - स्क्रिप्ट, जो nicerobot के समाधान से प्रेरित है, जो केवल प्रतिक्रिया शीर्षकों से अनुरोध करती है और here सुझाए गए आईएफएस का उपयोग करने से बचाती here । जब यह प्रतिक्रिया का सामना करता है तो यह बाउंस संदेश आउटपुट करता है> = 400. इस गूंज को बाउंस-स्क्रिप्ट के साथ प्रतिस्थापित किया जा सकता है।

# set the url to probe
url='http://localhost:8080'
# use curl to request headers (return sensitive default on timeout: "timeout 500"). Parse the result into an array (avoid settings IFS, instead use read)
read -ra result <<< $(curl -Is --connect-timeout 5 "${url}" || echo "timeout 500")
# status code is second element of array "result"
status=${result[1]}
# if status code is greater than or equal to 400, then output a bounce message (replace this with any bounce script you like)
[ $status -ge 400  ] && echo "bounce at $url with status $status"

यहाँ:

url='http://localhost:8080/'
status=$(r=(IFS=' ';$(curl -Is --connect-timeout 5 "${url}" || echo 1 500));echo ${r[1]})
[ status -eq 500 ] && bounce # assuming the bounce script is called 'bounce'

या इसे सब एक पंक्ति पर रखें:

[ 500 -eq $(r=(IFS=' ';$(curl -Is --connect-timeout 5 'http://localhost:8080/' || echo 1 500));echo ${r[1]}) ] && bounce

व्याख्या करने के लिए, HTTP प्रतिक्रिया में हमेशा प्रतिक्रिया की पहली पंक्ति के हिस्से के रूप में सर्वर स्थिति होती है, जैसे:

HTTP/1.1 200 OK
HTTP/1.0 404 NOT FOUND

स्क्रिप्ट सिर्फ स्थानीयहोस्ट को हेड अनुरोध करने के लिए कर्ल का उपयोग करता है: 8080। यह HTTP शीर्षलेख को सरणी में परिवर्तित करता है और दूसरा तत्व देता है। कुछ विफलता हैंडलिंग को सरल बनाने के लिए, यदि HEAD 5 सेकंड के भीतर कनेक्ट होने में विफल रहता है या किसी कारण से कर्ल विफल रहता है, तो 500 भी वापस आ जाता है।


curl --write-out "%{http_code}\n" --silent --output /dev/null "$URL"

काम करता है। यदि नहीं, तो आपको कोड को देखने के लिए वापसी करना होगा।





http-headers