サービスの特定の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に私がやりたいことをさせる方法はありますか、それとも私が見なければならない他のツールがありますか?
-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
サイトが生きているかどうかを確認する最も簡単な方法として、次の方法を使用できると思います:
curl -Is http://www.google.com | head -n 1
これはHTTP/1.1 200 OK
を返します。戻り値が出力と一致しない場合は、助けを求めてください。
-s
フラグ(サイレント)、-f
フラグ(エラー時に終了コードで失敗)が必要であり、-o
フラグを使用して出力をリダイレクトできます。
curl www.websiteToTest.com -s -f -o /dev/null || echo "Website down." | mail -s "Website is down" [email protected]
これは単純なcronスクリプトの悪い例にすぎません。通常、ウェブサイトがダウンした場合に1通のメールのみを受け取ります。
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
回答:
#!/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
コマンド。)-checkend
ディレクティブは、証明書の有効期限をチェックします。私の例では、20秒です(秒単位で指定)。この方法は、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"
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ブロックにいくつかの変更を加えると、必要に応じて他のステータスコードを簡単にテストできます
私は最近、より洗練されたハートビートのように振る舞うようなものを思いつくように頼まれました。
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を検索してエラーを見つけます。