[http] bash / shell 스크립트에서 http 응답 코드를 평가하는 방법은 무엇입니까?

나는 명백한 것을 놓치고 있지만 man [curl|wget]Google에 성공하지 못했다는 느낌을 가지고 있습니다 ( “http”는 그러한 나쁜 검색어를 만듭니다). 자주 실패하는 웹 서버 중 하나에 대한 빠른 수정 프로그램을 찾고 있는데 오류 메시지와 함께 상태 코드 500을 반환합니다. 이 문제가 발생하면 다시 시작해야합니다.

근본 원인을 찾기 어려워 보이는 것처럼, 우리는 빠른 수정을 목표로하고 있습니다. 실제로 해결할 수있을 때까지 시간을 연결하기에 충분할 것으로 기대합니다 (서비스에는 고 가용성이 필요하지 않음)

제안 된 솔루션은 5 분마다 실행되는 cron 작업을 작성하여 http : // localhost : 8080 /을 확인하는 것 입니다. 상태 코드 500과 함께 반환되면 웹 서버가 다시 시작됩니다. 1 분 안에 서버가 다시 시작되므로 이미 실행중인 다시 시작을 확인할 필요가 없습니다.

문제의 서버는 현재 필요한 것을 실행하기에 충분한 패키지가 설치된 우분투 8.04 최소 설치입니다. bash에서 작업을 수행하는 데 필요한 요구 사항은 없지만 더 이상 인터프리터를 설치하지 않고도 최소한의 환경에서 실행하고 싶습니다.

(환경 변수에 http 상태 코드를 할당하는 명령 / 옵션이면 충분하다는 스크립팅에 충분히 익숙합니다. 이것은 내가 찾았고 찾을 수 없었습니다.)



답변

나는 이것을 500 코드에서 테스트하지는 않았지만 200, 302 및 404와 같은 다른 코드에서는 작동합니다.

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

–write-out에 제공된 형식은 따옴표로 묶어야합니다. @ibai가 제안한대로 --headHEAD 전용 요청을 추가하십시오 . 페이지 내용이 전송되지 않기 때문에 검색이 성공할 때 시간이 절약됩니다.


답변

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

공장. 그렇지 않은 경우 코드 자체를 보려면 return 키를 눌러야합니다.


답변

나는 오늘 무언가를 빨리 시연해야했고 이것을 생각해 냈습니다. 누군가 OP의 요청과 비슷한 것이 필요하다면 여기에 배치 할 것이라고 생각했습니다.

#!/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에서 상태가 변경 될 때마다 이메일 알림을 보내므로 멍청하고 욕심이 많습니다. 이를 개선하기 위해 여러 상태 코드를 반복하고 결과에 따라 다른 작업을 수행하는 방법을 살펴 보겠습니다.


답변

허용 반응이 좋은 대답은, 그것은 실패 시나리오를 내려다보고 있습니다. 요청에 오류가 있거나 연결이 실패하면이 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


답변

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


답변

모든 요청에 ​​대해 3XX 리디렉션을 따르고 응답 코드를 인쇄하려면 다음을 수행하십시오.

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


답변

이것은 http 상태를 평가하는 데 도움이 될 수 있습니다

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