こんにちは、さるまりんです。
サイトが正常に稼働しているかを監視する。ブラウザでみにいけばわかりますが、ずっとは無理ですよね。
自作で確認することはできないかと思ってやってみました。
基本的には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で簡単にチェックしてみました。
サイトの稼働状況、死活監視をするサービスも色々とあると思うのですが、簡単なものならこれで済むように思います。このスクリプトが動いているコンピュータが止まってしまったらもちろん監視できてない状態になります。スクリプトを複数のコンピュータから実行?それも複数のロケーションで?とか、さまざまな形で抜かりなくできたらいいのですけど、それならばそのためのソリューションを導入するのが良いと思います。あくまで簡単なものだけで。
読んでくださってありがとうございました。
それではまた!