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


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

カールのオプションを調べてみましたが、成功した場合に静かにしたいが、エラーが発生したい場合に適したものが見つかりません。

curlが私が望んでいることをさせる方法はありますか、または私が見なければならない他のツールはありますか?


2
icinga他の監視システムを使用してはどうですか?
ステファンシャゼル

共有ホスト上のリソースが限られている趣味のプロジェクトでこれを使用しています。それ以外の場合は、監視システムを使用したいと思います。とにかくヒントをありがとう、私は前にイシンガのことを聞いたことがなかった
パルト

アカウントのすべてのページに頻繁にアクセスしている場合、共有ホスティングプロバイダーはこれに眉をひそめます。プロバイダーには通常、同時プロセス制限と最大実行時間制限があります。また、この方法は、ユーザーとプロバイダーの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。何も問題がない場合は何も出力されませんが、エラーのステータスコードを出力しますが、これは私には問題ありません。
パルト

1
OK、-f今後の参照用に追加。
13

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への接続など)を確認して、より意味のある結果を得ることができるため、素晴らしいです。
ネイサン

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スクリプトの単なる悪い例です。通常、Webサイトがダウンしている場合、メールを1つだけ取得します。


8

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

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ステータスコードのみを出力しました。次に、400以上のHTTPステータスコードを検索してエラーを見つけます。


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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.