web-dev-qa-db-ja.com

curlを使用したWebページのヘルスチェック

サービスの特定の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

カールのオプションを調べてみましたが、成功したときに黙ってほしいが、エラーが発生したいという状況に適したものが見つかりません。

Curlに私がやりたいことをさせる方法はありますか、それとも私が見なければならない他のツールがありますか?

37
palto

-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
42
ahilsend

サイトが生きているかどうかを確認する最も簡単な方法として、次の方法を使用できると思います:

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

これはHTTP/1.1 200 OKを返します。戻り値が出力と一致しない場合は、助けを求めてください。

13
Raza

-sフラグ(サイレント)、-fフラグ(エラー時に終了コードで失敗)が必要であり、-oフラグを使用して出力をリダイレクトできます。

curl www.websiteToTest.com -s -f -o /dev/null || echo "Website down." | mail -s "Website is down" [email protected] 

これは単純なcronスクリプトの悪い例にすぎません。通常、ウェブサイトがダウンした場合に1通のメールのみを受け取ります。

9
jofel

curlからネットワークタイミング統計をキャプチャできます。リクエスト/レスポンスサイクルの各フェーズのレイテンシは、正常性を判断するのに役立ちます。

$ 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
9
Corey Goldberg

回答:

#!/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秒のタイムアウトを設定します。遅い回答は「健康的でない」と見なされます
  • カール-fフラグは早期に失敗します、-Sはエラーを表示します、-sは通常の出力を抑制し、-Iは、コンテンツではなく、HTTPヘッダーのみをフェッチします。 (いつものように、man curlコマンド。)
  • openssl -checkendディレクティブは、証明書の有効期限をチェックします。私の例では、20秒です(秒単位で指定)。
2
VasyaNovikov

この方法は、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"
2
christian

Curlには非常に特定の終了ステータスコードがあります
それらをチェックするだけではどうですか?

#!/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ブロックにいくつかの変更を加えると、必要に応じて他のステータスコードを簡単にテストできます

2
Silvernode

私は最近、より洗練されたハートビートのように振る舞うようなものを思いつくように頼まれました。

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
elee