curl을 사용하여 웹 페이지의 상태 확인


34

특정 URL을 호출하여 서비스 상태를 확인하고 싶습니다. 가장 간단한 해결책은 cron을 사용하여 1 분마다 확인하는 것입니다. 오류가 발생하면 cron에서 전자 메일을 보냅니다.

나는 이것을 위해 cUrl을 사용해 보았지만 오류시에만 메시지를 출력 할 수는 없다. 출력을 / dev / null로 보내려고하면 진행률 보고서가 인쇄됩니다.

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  5559  100  5559    0     0   100k      0 --:--:-- --:--:-- --:--:--  106k

컬 옵션을 살펴 보았지만 성공시 침묵하고 싶지만 오류가 발생하는 상황에 적합한 것을 찾을 수는 없습니다.

컬이 내가 원하는 것을 할 수있는 방법이 있습니까? 아니면 내가보아야 할 다른 도구가 있습니까?


2
icinga다른 모니터링 시스템을 사용 하거나 사용 하는 것은 어떻습니까?
Stéphane Chazelas

공유 호스트의 리소스가 제한적인 취미 프로젝트에서 이것을 사용하고 있습니다. 그렇지 않으면 모니터링 시스템을 사용하고 싶습니다. 팁 주셔서 감사합니다 어쨌든, 나는 전에 icinga 들어하지 않았다
palto

계정의 모든 페이지를 너무 자주 방문하는 경우 공유 호스팅 제공 업체가 이에 대해 눈살을 찌푸 릴 것입니다. 공급자는 일반적으로 동시 프로세스 제한과 최대 실행 시간 제한이 있습니다. 또한 귀하와 제공자의 DC 사이에 네트워크 중단이있는 경우이 방법이 정확하지 않습니다. 공유 계정의 도메인 액세스 로그를 조사해야합니다. 일반적으로 봇으로부터의 트래픽이 많고 무작위 방문자 만 있으면 사이트 사용 가능 여부를 매우 잘 알 수 있습니다.
rcjohnson

답변:


39

무엇에 대해 -sSf? 매뉴얼 페이지에서 :

  -s/--silent
     Silent or quiet mode. Do not show progress meter or error messages.  
     Makes Curl mute.

  -S/--show-error
     When used with -s it makes curl show an error message if it fails.

  -f/--fail
     (HTTP)  Fail silently (no output at all) on server errors. This is mostly
     done to better enable scripts etc to better deal with failed attempts. In
     normal  cases  when a HTTP server fails to deliver a document, it returns
     an HTML document stating so (which often also describes  why  and  more).
     This flag will prevent curl from outputting that and return error 22.

     This method is not fail-safe and there are occasions where non-successful
     response codes will  slip  through,  especially  when  authentication  is
     involved (response codes 401 and 407).

예를 들면 다음과 같습니다.

curl -sSf http://example.org > /dev/null

3
-sS가 어떤 이유로 오류 메시지를 출력하지 않았습니다. -f도 추가해야했습니다. 올바른 작업 명령은 것 같습니다 curl -fsS http://example.org > /dev/null. 아무것도 잘못되면 아무것도 출력하지 않지만 오류가 발생하면 상태 코드가 인쇄됩니다.
palto

1
-f나중에 참조 할 수 있도록 추가되었습니다 .
ahilsend

10

사이트가 살아 있는지 확인하는 가장 간단한 방법은 다음 방법을 사용할 수 있다고 생각합니다.

curl -Is http://www.google.com | head -n 1

이 반환 HTTP/1.1 200 OK됩니다. 반품이 출력과 일치하지 않으면 도움을 요청하십시오.


1
상태 코드를 선택하면 다른 제안처럼 아마 더 의미가 있습니다
Dukeatcoding

"HTTP / 1.1 302 Found"가 표시됩니다.
스폰지 동지

1
이것은 ping을 넘어서서 내 사이트가 올바르게로드되는지 확인하고 (mySQL에 대한 연결 등)보다 의미있는 결과를 얻을 수 있기 때문에 좋습니다.
Nathan

8

-s플래그 (자동), -f플래그 (오류 발생시 종료 코드로 실패 ) 가 필요하며 플래그 를 사용하여 -o출력을 재 지정할 수 있습니다 .

curl www.websiteToTest.com -s -f -o /dev/null || echo "Website down." | mail -s "Website is down" admin@thesite.com 

이것은 간단한 cron 스크립트에 대한 나쁜 예일뿐입니다. 일반적으로 웹 사이트가 다운 된 경우 메일을 하나만 받으려고합니다.


8

컬에서 네트워크 타이밍 통계를 캡처 할 수 있습니다. 요청 / 응답주기에서 각 단계의 대기 시간은 상태를 결정하는 데 유용 할 수 있습니다.

$ URL=https://example.com
$ curl "$URL" -s -o /dev/null -w \
> "response_code: %{http_code}\n
> dns_time: %{time_namelookup}
> connect_time: %{time_connect}
> pretransfer_time: %{time_pretransfer}
> starttransfer_time: %{time_starttransfer}
> total_time: %{time_total}
> "
response_code: 200

dns_time: 0.029
connect_time: 0.046
pretransfer_time: 0.203
starttransfer_time: 0.212
total_time: 0.212

2

이 방법은 https가있을 때 사이트를 테스트 할 때 도움이됩니다.

#!/bin/bash
# put your domain in this var
https=https://www.somewebsite.com

# save the status in some variable 
status=`curl $https -k -s -f -o /dev/null && echo "SUCCESS" || echo "ERROR"`    

# print results (or use it in your scripts)
echo "testing $https=$status"

1

나는 최근에 정교한 심장 박동처럼 행동 할 수있는 무언가를 생각해 보라는 요청을 받았습니다.

for i in `curl -s -L cnn.com |egrep --only-matching "http(s?):\/\/[^ \"\(\)\<\>]*" | uniq` ; do curl -s -I $i 2>/dev/null |head -n 1 | cut -d$' ' -f2; done

가독성을 높이기 위해 확장했거나

for i in $(curl -s -L cnn.com |egrep --only-matching 'http(s?):\/\/[^ \"\(\)\<\>]*' | uniq)
do
    curl -s -I "$i" 2>/dev/null | head -n 1 | cut -d' ' -f2
done

내가 한 것은 curl웹 사이트에서 html의 모든 링크를 curl구문 분석 한 다음 구문 분석 된 링크를 구문 분석하여 상태 코드 만 출력했습니다. 그런 다음 http 상태 코드> = 400을 검색하여 오류를 찾습니다.


1

대답:

#!/bin/bash -eu
timeout 3s curl -fIsS http://example.org > /dev/null
# and if you have TLS (https), check if it's about to expire:
true | openssl s_client -connect example.org:443 2>/dev/null | openssl x509 -noout -checkend "$((3600*24*20))"

설명 :

  • timeout 3s귀하의 요청에 3 초 시간 초과를 설정합니다. 느리게 대답하는 것은 "건강하지 않은"것으로 간주됩니다
  • curl -f플래그는 일찍 실패하고 -S오류 -s를 표시하며 정상적인 출력을 억제 -I하고 컨텐츠가 아닌 HTTP 헤더 만 가져옵니다. 항상 그렇듯이 man curl명령 에 대한 자세한 내용을 볼 수 있습니다 .
  • openssl -checkend지시문은 인증서의 만료 날짜를 확인합니다. 이 예에서는 20 일 (초로 지정)입니다.

나는 당신이 설명 -s하고 -S교환 했다고 생각합니다
nafg

1

컬은 매우 구체적인 종료 상태 코드를 가지고 있습니다.
왜 그런 코드를 확인하지 않습니까?

#!/bin/bash

##name: site-status.sh

FAIL_CODE=6

check_status(){
    LRED="\033[1;31m" # Light Red
    LGREEN="\033[1;32m" # Light Green
    NC='\033[0m' # No Color


    curl -sf "${1}" > /dev/null

    if [ ! $? = ${FAIL_CODE} ];then
        echo -e "${LGREEN}${1} is online${NC}"
    else
        echo -e "${LRED}${1} is down${NC}"
    fi
}


check_status "${1}"

용법:

$ site-status.sh example.com

결과:

$ example.com is online

노트:

이 스크립트는 사이트를 해결할 수 있는지 확인합니다.

관심이있는 모든 사이트가 위 또는 아래에있는 경우이 코드를 사용하십시오.
그러나 if / else 블록을 약간 변경하면 원하는 경우 다른 상태 코드를 쉽게 테스트 할 수 있습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.