Bashで作るシンプルなサイト死活監視シェルスクリプト

本記事では、Bashシェルスクリプトとcurlを使用したシンプルなサイト死活監視スクリプトを解説します。このスクリプトを使えば、監視対象サイトに障害が発生したときに、指定したメールアドレスに通知を送信し、正常時にも状況を確認できるようになります。

目次

  1. スクリプトの全体構造
  2. 各部分の解説
  3. Cronでの自動実行設定

1. スクリプトの全体構造

以下がサイトの死活監視を行うシェルスクリプト(Bashスクリプト)です。監視対象のサイトリストと通知先メールアドレスの設定、ステータスコードの取得、通知メールの送信を行います。

#!/bin/bash

# 監視対象サイトの配列 (URL, 通知先メールアドレスの配列)
declare -A sites
sites["https://example1.com"]="email1@example.com,email2@example.com"
sites["https://example2.com"]="email3@example.com,email4@example.com"

# すべての通知を受け取る当社のメールアドレス (BCC用)
bcc_email="company@example.com"

# メール通知関数
send_email() {
    local site=$1
    local emails=$2
    local status_code=$3
    local status_message=$4
    local subject="【サイト監視】$site は$status_message (HTTPステータスコード: $status_code)"
    local body="$site の監視結果: $status_message\nHTTPステータスコード: $status_code\nご確認ください。"

    # メール送信 (BCCに当社のメールアドレスを追加)
    echo -e "$body" | mail -s "$subject" -b "$bcc_email" "$emails"
}

# サイトの死活監視
for site in "${!sites[@]}"; do
    emails="${sites[$site]}"

    # curlを使ってサイトのHTTPステータスコードを取得
    status_code=$(curl -o /dev/null -s -w "%{http_code}" "$site")

    # ステータスコードによる通知内容の判断
    if [[ "$status_code" == "200" || "$status_code" == "301" || "$status_code" == "302" ]]; then
        # 正常時の通知
        send_email "$site" "$emails" "$status_code" "正常に稼働中"
    else
        # 異常時の通知
        send_email "$site" "$emails" "$status_code" "ダウンしています"
    fi
done

2. 各部分の解説

監視対象サイトの設定

スクリプトの冒頭で、監視対象となるサイトのURLと通知先メールアドレスを設定しています。各サイトごとに複数の通知先メールアドレスを指定できるように、カンマ区切りで設定します。

declare -A sites
sites["https://example1.com"]="email1@example.com,email2@example.com"
sites["https://example2.com"]="email3@example.com,email4@example.com"

BCCメールアドレスの設定

すべての通知をBCCで受け取るためのメールアドレスを設定します。

bcc_email="company@example.com"

メール送信関数 send_email

この関数は、サイトの状況に応じてメールを送信します。mail コマンドを利用し、送信先はemails変数で指定し、すべての通知にbcc_emailが追加されるようにしています。メールの件名と本文にはHTTPステータスコードと、稼働状況(「正常に稼働中」または「ダウンしています」)が含まれます。

send_email() {
    local site=$1
    local emails=$2
    local status_code=$3
    local status_message=$4
    local subject="【サイト監視】$site は$status_message (HTTPステータスコード: $status_code)"
    local body="$site の監視結果: $status_message\nHTTPステータスコード: $status_code\nご確認ください。"

    # メール送信 (BCCに当社のメールアドレスを追加)
    echo -e "$body" | mail -s "$subject" -b "$bcc_email" "$emails"
}

サイトの死活監視と通知の実行

forループで各サイトを順番に監視します。curlコマンドでHTTPステータスコードを取得し、200、301、302以外のステータスコードの場合に異常と判断します。正常時・異常時のいずれにおいてもsend_email関数を呼び出し、メール通知を行います。

for site in "${!sites[@]}"; do
    emails="${sites[$site]}"
    status_code=$(curl -o /dev/null -s -w "%{http_code}" "$site")
    if [[ "$status_code" == "200" || "$status_code" == "301" || "$status_code" == "302" ]]; then
        send_email "$site" "$emails" "$status_code" "正常に稼働中"
    else
        send_email "$site" "$emails" "$status_code" "ダウンしています"
    fi
done

3. Cronでの自動実行設定

このシェルスクリプト(Bashスクリプト)を自動で実行するために、cronに設定します。5分ごとに監視を実行する例を以下に示します。

crontab -e

以下の行を追加して保存すると、5分ごとにスクリプトが実行されます。

*/5 * * * * /path/to/site_monitor.sh

まとめ

今回のシェルスクリプト(Bashスクリプト)は、シンプルながら監視対象の稼働状況をメールで知らせる仕組みを提供します。Bashとcurlを利用し、管理者がいち早く障害を検知できる環境を作りましょう。

関連記事

コメント

タイトルとURLをコピーしました