こんにちは、さるまりんです。
サイトが正常に稼働しているかを監視する。ブラウザでみにいけばわかりますが、ずっとは無理ですよね。
自作で確認することはできないかと思ってやってみました。
基本的にはcurl
コマンドを使ってサイトにアクセス、HTTPステータスコードを確認してその結果をもとに判断しています。
稼働をチェックするスクリプト
指定したURLのステータスコードを確認して、正常(200 OK
)であれば稼働していると判断するスクリプトです。
site_check.sh
#!/bin/bash
# 確認したいURLを指定
URL="https://salumarine.com"
# HTTPステータスコードを取得
STATUS_CODE=$(curl -o /dev/null -s -w "%{http_code}" "$URL")
# ステータスコードに応じた処理
if [ "$STATUS_CODE" -eq 200 ]; then
echo "site is up and running (HTTP $STATUS_CODE)"
else
echo "site might not be functioning! (HTTP $STATUS_CODE)"
# 必要に応じてここで何かします。(管理者に通知するなど)
fi
ページ全体を取得したいわけではないので、curl
コマンドに-o /dev/null
とすることで出力(レスポンスのボディ)を捨てています。-s
はサイレントモードのオプションです。進捗やエラーメッセージを表示しません。-w "{%http_code}"
でHTTPステータスコードのみを出力してその結果を変数STATUS_CODE
に格納しています。
あとはif
で条件分岐です。ステータスが200
(OK)の場合とそれ以外の場合で処理を分けています。
ログファイルに記録するように改良してみます。
echo
の出力先をログファイルにするだけです。
LOG_FILE="site_check.log"
if [ "$STATUS_CODE" -eq 200 ]; then
echo "site is up and running (HTTP $STATUS_CODE)" >> $LOG_FILE
else
echo "site might not be functioning! (HTTP $STATUS_CODE)" >> $LOG_FILE
fi
異常時にsendmail
を使ってメールで通知したい場合はこんな感じです。
if [ "$STATUS_CODE" -ne 200 ]; then
echo "Subject: site might not be running" | sendmail $ADMIN_ADDR
fi
STATUS_CODEに対するif
の条件で-ne 200
としていて、200
ではないときに処理をしています。変数ADMIN_ADDR
には通知したいメールアドレスを格納しています。
定期実行の設定
このスクリプトを定期的に実行するにはcron
を使います。
* * * * * /path/to/your/site_check.sh
スクリプトを毎分実行する設定です。
今回はcurl
で簡単にチェックしてみました。
サイトの稼働状況、死活監視をするサービスも色々とあると思うのですが、簡単なものならこれで済むように思います。このスクリプトが動いているコンピュータが止まってしまったらもちろん監視できてない状態になります。スクリプトを複数のコンピュータから実行?それも複数のロケーションで?とか、さまざまな形で抜かりなくできたらいいのですけど、それならばそのためのソリューションを導入するのが良いと思います。あくまで簡単なものだけで。
読んでくださってありがとうございました。
それではまた!