シンプルなWebサイトの稼働チェックスクリプトを作ってみました

こんにちは、さるまりんです。

サイトが正常に稼働しているかを監視する。ブラウザでみにいけばわかりますが、ずっとは無理ですよね。

自作で確認することはできないかと思ってやってみました。

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

読んでくださってありがとうございました。

それではまた!