Как оценить коды ответов http из скрипта bash / shell? - PullRequest
168 голосов
/ 08 февраля 2010

У меня такое ощущение, что я упускаю очевидное, но не удалось с man [curl|wget] или Google («http» делает такой плохой поисковый термин). Я ищу быстрое и грязное исправление для одного из наших веб-серверов, которое часто выходит из строя и возвращает код состояния 500 с сообщением об ошибке. Как только это произойдет, его нужно перезапустить.

Поскольку основную причину, по-видимому, трудно найти, мы стремимся к быстрому исправлению, надеясь, что этого будет достаточно, чтобы сократить время, пока мы действительно не сможем это исправить (службе не требуется высокая доступность)

Предлагаемое решение состоит в создании задания cron, которое запускается каждые 5 минут, проверяя http://localhost:8080/. Если это возвращается с кодом состояния 500, веб-сервер будет перезапущен. Сервер будет перезагружен через минуту, поэтому нет необходимости проверять перезапуски, которые уже запущены.

Рассматриваемый сервер является минимальной установкой Ubuntu 8.04 с достаточным количеством установленных пакетов для запуска того, что ему нужно в данный момент. В bash нет строгих требований для выполнения задачи, но я бы хотел, чтобы она работала в такой минимальной среде без установки дополнительных переводчиков.

(Я достаточно знаком со сценариями, что команды / опции для назначения кода состояния http переменной среды будет достаточно - это то, что я искал и не мог найти.)

Ответы [ 10 ]

270 голосов
/ 08 февраля 2010

Я не проверял это на коде 500, но он работает на других, таких как 200, 302 и 404.

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

Как предложено @ibai, добавьте --head, чтобы сделать только HEADзапрос.Это сэкономит время при успешном извлечении, поскольку содержимое страницы не будет передано.

36 голосов
/ 23 мая 2012
curl --write-out "%{http_code}\n" --silent --output /dev/null "$URL"

работает. Если нет, вы должны нажать кнопку возврата, чтобы просмотреть сам код.

16 голосов
/ 24 октября 2017

Мне нужно было что-то быстро показать сегодня, и я придумал это. Думаю, я бы разместил его здесь, если бы кому-то нужно что-то похожее на запрос ОП.

#!/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, так что это глупо и потенциально жадно. Чтобы улучшить это, я бы посмотрел на циклический просмотр нескольких кодов состояния и выполнение различных действий в зависимости от результата.

13 голосов
/ 08 февраля 2010

Хотя принятый ответ является хорошим ответом, он не учитывает сценарии сбоев. 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 голосов
/ 08 февраля 2010

С помощью netcat и awk вы можете обработать ответ сервера вручную:

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
8 голосов
/ 31 октября 2015

Чтобы выполнить перенаправления 3XX и распечатать коды ответов для всех запросов:

HTTP_STATUS="$(curl -IL --silent example.com | grep HTTP )";    
echo "${HTTP_STATUS}";
2 голосов
/ 27 января 2017

Здесь идет скучный, но простой для понимания сценарий, вдохновленный решением nicerobot , который запрашивает только заголовки ответа и избегает использования IFS, как предлагается здесь . Он выводит сообщение о сбое, когда встречает ответ> = 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"
2 голосов
/ 12 мая 2016

Еще один вариант:

       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-)
1 голос
/ 21 ноября 2015

это может помочь оценить статус http

var=`curl -I http://www.example.org 2>/dev/null | head -n 1 | awk -F" " '{print $2}'`
echo http:$var
0 голосов
/ 23 марта 2016

Чтобы добавить комментарий @DennisWilliamson выше:

@ VaibhavBajpai: Попробуйте это: response = $ (curl --write-out \ n% {http_code} --silent --output - servername) - последняя строка в результате будет кодом ответа

Затем вы можете проанализировать код ответа из ответа, используя что-то вроде следующего, где X может означать регулярное выражение для обозначения конца ответа (используя пример json здесь)

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

См. Удаление подстроки: http://tldp.org/LDP/abs/html/string-manipulation.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...