বাশ / শেল স্ক্রিপ্ট থেকে কীভাবে http প্রতিক্রিয়া কোডগুলি মূল্যায়ন করবেন?


203

আমার অনুভূতি আছে যে আমি স্পষ্টতই মিস করছি তবে man [curl|wget]গুগল ("HTTP" এর ফলে খারাপ অনুসন্ধান শব্দটি তৈরি হয়েছে) বা সফল হয়নি । আমি আমাদের ওয়েবসভারগুলির মধ্যে একটিতে দ্রুত এবং নোংরা ফিক্স খুঁজছি যা প্রায়শই ব্যর্থ হয়, ত্রুটি বার্তায় স্ট্যাটাস কোড 500 ফিরিয়ে দেয়। একবার এটি হয়ে গেলে, এটি আবার চালু করা দরকার।

মূল কারণটি যেমন খুঁজে পাওয়া কঠিন বলে মনে হচ্ছে, আমরা দ্রুত সমাধানের লক্ষ করছি, আমরা আশা করছি যে এটি ঠিক করা না হওয়া পর্যন্ত সময় পার করা যথেষ্ট হবে (পরিষেবাটির উচ্চতর প্রাপ্যতার প্রয়োজন নেই)

প্রস্তাবিত সমাধানটি হ'ল একটি ক্রোন জব তৈরি করা যা প্রতি 5 মিনিটে চলে : এইচটিপি: // লোকালহোস্ট: 8080 / পরীক্ষা করে । এটি যদি স্ট্যাটাস কোড 500 সহ ফিরে আসে তবে ওয়েবসভারটি পুনরায় চালু হবে। সার্ভারটি এক মিনিটের মধ্যে পুনরায় চালু হবে, সুতরাং ইতিমধ্যে চলমান পুনঃসূচনাগুলি পরীক্ষা করার দরকার নেই।

প্রশ্নে থাকা সার্ভারটি একটি উবুন্টু 8.04 ন্যূনতম ইনস্টলেশন যা বর্তমানে পর্যাপ্ত প্যাকেজ ইনস্টল করা রয়েছে যা বর্তমানে প্রয়োজন এটি চালানোর জন্য। ব্যাশে টাস্কটি করার জন্য কোনও কঠোর প্রয়োজন নেই, তবে আমি আরও কোনও দোভাষী না ইনস্টল করে এমন ন্যূনতম পরিবেশে চালানো চাই।

(স্ক্রিপ্টিংয়ের সাথে আমি যথেষ্ট পরিচিত যে একটি এনভায়রনমেন্ট ভেরিয়েবলের HTTP স্থিতি কোড দেওয়ার জন্য কমান্ড / বিকল্পগুলি যথেষ্ট হবে - আমি এটি সন্ধান করেছি এবং খুঁজে পাইনি))

উত্তর:


316

আমি এটি একটি 500 কোডে পরীক্ষা করেছি না, তবে এটি 200, 302 এবং 404 এর মতো অন্যদের জন্যও কাজ করে।

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

দ্রষ্টব্য, - রাইটআউট-এর জন্য সরবরাহিত ফর্ম্যাটটি উদ্ধৃত করা উচিত। @ বাই দ্বারা প্রস্তাবিত হিসাবে, --headকেবল একটি হেড অনুরোধ করতে যোগ করুন । পৃষ্ঠার বিষয়বস্তু প্রেরণ করা হবে না বলে পুনরুদ্ধার সফল হলে এটি সময় সাশ্রয় করবে।


1
সুন্দর - ধন্যবাদ: আমি ইতিমধ্যে - রাইটআউট খুঁজে পেয়েছি, তবে - আউটপুট / দেব / নাল মিস করেছি। সমস্ত সামগ্রী যখন এটির সাথে আসে তখন প্রতিক্রিয়া কোডটি খুব বেশি তথ্যে হারিয়ে যায়, তাই আমি কেবল এটি দেখতে পাইনি ...
ওলাফ কক

4
আমি প্রতিক্রিয়া কোড এবং আউটপুট উভয়ই পৃথক ভেরিয়েবলগুলিতে সঞ্চয় করতে পারি? প্রতিক্রিয়ার কোডটি 200 না হলে আমি আউটপুট প্রতিধ্বনি করতে চাই
বৈভব বাজপাই

7
@ বৈভববাজপাই: এটি চেষ্টা করুন: response=$(curl --write-out \\n%{http_code} --silent --output - servername)- ফলাফলের শেষ লাইনটি প্রতিক্রিয়া কোড হবে।
পরবর্তী বিজ্ঞপ্তি না হওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

2
যদি প্রথম অনুরোধের ফলাফল 3XX হয় তবে এটি চূড়ান্ত অনুরোধের স্থিতি দেখায় না। উদাহরণস্বরূপ যদি প্রত্যাবর্তিত মানটি 301 পুনর্নির্দেশ হয় তবে এই স্ক্রিপ্টটি কেবল সেখানে থামবে। আপনি যদি যোগ করেন, তবে আপনি চূড়ান্ত স্থিতি পেতে পারেন। আপনি যদি সমস্ত অনুরোধের জন্য সমস্ত এইচটিটিপি স্থিতি প্রদর্শন করতে চান তবে নীচে আমার উদাহরণটি ব্যবহার করুন।
সিলিকনরॉकস্টার

দুর্দান্ত কাজ করছি, ধন্যবাদ! তবে আমার ক্ষেত্রে (https) আমারও দরকার --insecureছিল।
টমাসজ রাকিয়া

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

কাজ করে। যদি তা না হয় তবে কোডটি নিজেই দেখতে আপনাকে ফিরে আসতে হবে।


33

আমার আজ খুব দ্রুত কিছু ডেমো করা দরকার এবং এটি নিয়ে এসেছি। ভেবেছিলাম যে যদি কারও ওপির অনুরোধের অনুরূপ কিছু প্রয়োজন হয় তবে আমি এটি এখানে রাখব।

#!/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" "my_email@email.com" -r "STATUS_CHECKER"
else
  exit 0
fi

এটি 200 থেকে প্রতিটি রাজ্যের পরিবর্তনে ইমেল সতর্কতা প্রেরণ করবে, সুতরাং এটি বোবা এবং সম্ভাব্য লোভী। এটি উন্নত করতে, আমি বেশ কয়েকটি স্থিতি কোডের মধ্য দিয়ে লুপিং এবং ফলাফলের উপর নির্ভর করে বিভিন্ন ক্রিয়া সম্পাদন করতে দেখব।


20

যদিও গৃহীত প্রতিক্রিয়া একটি ভাল উত্তর, এটি ব্যর্থতার পরিস্থিতিগুলিকে উপেক্ষা করে। অনুরোধে ত্রুটি থাকলে বা সংযোগে ব্যর্থতা উপস্থিত হলে curlফিরে আসবে 000

url='http://localhost:8080/'
status=$(curl --head --location --connect-timeout 5 --write-out %{http_code} --silent --output /dev/null ${url})
[[ $status == 500 ]] || [[ $status == 000 ]] && echo restarting ${url} # do start/restart logic

দ্রষ্টব্য: এটি অনুরোধকৃত 500স্থিতি পরীক্ষার কিছুটা অতিক্রম করে এটিও নিশ্চিত করে যে curlএটি সার্ভারের সাথেও সংযুক্ত হতে পারে (যেমন প্রত্যাবর্তন 000)।

এটি থেকে একটি ফাংশন তৈরি করুন:

failureCode() {
    local url=${1:-http://localhost:8080}
    local code=${2:-500}
    local status=$(curl --head --location --connect-timeout 5 --write-out %{http_code} --silent --output /dev/null ${url})
    [[ $status == ${code} ]] || [[ $status == 000 ]]
}

পরীক্ষা পেয়ে একটি 500:

failureCode http://httpbin.org/status/500 && echo need to restart

পরীক্ষায় ত্রুটি / সংযোগ ব্যর্থতা (যেমন 000):

failureCode http://localhost:77777 && echo need to start

পরীক্ষা হচ্ছে না 500:

failureCode http://httpbin.org/status/400 || echo not a failure

9

নেটক্যাট এবং অ্যাডকের সাহায্যে আপনি সার্ভারের প্রতিক্রিয়াটিকে ম্যানুয়ালি হ্যান্ডেল করতে পারবেন:

if netcat 127.0.0.1 8080 <<EOF | awk 'NR==1{if ($2 == "500") exit 0; exit 1;}'; then
GET / HTTP/1.1
Host: www.example.com

EOF

    apache2ctl restart;
fi

9

3XX পুনর্নির্দেশগুলি অনুসরণ করতে এবং সমস্ত অনুরোধগুলির জন্য প্রতিক্রিয়া কোডগুলি মুদ্রণ করতে:

HTTP_STATUS="$(curl -IL --silent example.com | grep HTTP )";    
echo "${HTTP_STATUS}";

grepতাদের মধ্যে "http" সঙ্গে সব লাইন ক্যাপচার হবে। হতে grep -m 1 HTTPপারে কেবল প্রথম ম্যাচটি দখল করার জন্য, যদি এটি উদ্দেশ্য হয় বা এর পরিবর্তে কেবল ফলাফল কোডটি বিশ্লেষণের জন্য অ্যাওকে পাইপ
ট্রিপলি

3

এটি HTTP স্থিতি মূল্যায়নে সহায়তা করতে পারে

var=`curl -I http://www.example.org 2>/dev/null | head -n 1 | awk -F" " '{print $2}'`
echo http:$var

2
head -n 1 | awk '{stuff}' খালি অ্যান্টিপ্যাটার্ন, awk 'NR==1 {stuff}'এক প্রক্রিয়াতে একই কাজ করে, খাঁটি আওক।
ট্রিপলি

3

আরেকটি প্রকরণ:

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

2

এখানে দীর্ঘ-বাতাসযুক্ত - এখনও বুঝতে সহজ - স্ক্রিপ্ট, নিকেরোবটের সমাধান দ্বারা অনুপ্রাণিত , যা কেবল প্রতিক্রিয়া শিরোনামগুলির জন্য অনুরোধ করে এবং এখানে বর্ণিত আইএফএস ব্যবহার করা এড়ানো যায় । এটি যখন একটি প্রতিক্রিয়া> = 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"

1

আমি এখানে উত্তরগুলি পছন্দ করি না যা স্থিতির সাথে ডেটা মেশায়। এটি খুঁজে পেয়েছে: আপনি কার্লটি ব্যর্থ হওয়ার জন্য -f পতাকা যুক্ত করুন এবং স্ট্যান্ডার্ড স্ট্যাটাসের ভেরি থেকে ত্রুটি স্থিতির কোডটি বেছে নিন: $?

/unix/204762/return-code-for-curl-used-in-a-command-substitution

আমি জানি না এটি এখানে প্রতিটি দৃশ্যের জন্য উপযুক্ত কিনা, তবে এটি আমার প্রয়োজনগুলির সাথে খাপ খায় এবং আমার মনে হয় এটির সাথে কাজ করা আরও সহজ


1

এখানে আমার বাস্তবায়ন, যা পূর্ববর্তী উত্তরগুলির চেয়ে কিছুটা ভারবস

curl https://somewhere.com/somepath   \
--silent \
--insecure \
--request POST \
--header "your-curl-may-want-a-header" \
--data @my.input.file \
--output site.output \
--write-out %{http_code} \
  > http.response.code 2> error.messages
errorLevel=$?
httpResponse=$(cat http.response.code)


jq --raw-output 'keys | @csv' site.output | sed 's/"//g' > return.keys
hasErrors=`grep --quiet --invert errors return.keys;echo $?`

if [[ $errorLevel -gt 0 ]] || [[ $hasErrors -gt 0 ]] || [[ "$httpResponse" != "200" ]]; then
  echo -e "Error POSTing https://somewhere.com/somepath with input my.input (errorLevel $errorLevel, http response code $httpResponse)" >> error.messages
  send_exit_message # external function to send error.messages to whoever.
fi

0

উপরে ডেনিস উইলিয়ামসন মন্তব্যটিতে যুক্ত করতে:

@ ভাইভাবাজপাই: এটি চেষ্টা করুন: প্রতিক্রিয়া = $ (কার্ল - রাইটআউট-আউট \ n% {http_code} --সাইলেন্ট - আউটপুট - সার্ভেনাম) - ফলাফলের শেষ লাইনটি প্রতিক্রিয়া কোড হবে

এরপরে আপনি নিম্নলিখিতগুলির মতো কিছু ব্যবহার করে প্রতিক্রিয়া থেকে প্রতিক্রিয়ার কোডটি পার্স করতে পারেন, যেখানে এক্স প্রতিক্রিয়ার শেষটি চিহ্নিত করতে একটি রেইজেক্সকে ইঙ্গিত করতে পারে (এখানে একটি জসন উদাহরণ ব্যবহার করে)

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

সাবস্ট্রিং অপসারণ দেখুন: http://tldp.org/LDP/abs/html/string-manipulation.html


আপনি কেন এই পরিবর্তনটিকে প্যাটার্নটি রাখবেন এবং কেন আপনি চূড়ান্ত মান অর্জন করতে অকেজোecho ব্যবহার করবেন ? কেবল code=${response##*\}}সহজ এবং বেশ কয়েকটি সাধারণ সমস্যাগুলি এড়ানো হয়। এছাড়াও, এটি একটি গ্লোব প্যাটার্ন, সঠিক নিয়মিত প্রকাশ নয়।
ট্রিপলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.