本記事では、Bashシェルスクリプトとcurl
を使用したシンプルなサイト死活監視スクリプトを解説します。このスクリプトを使えば、監視対象サイトに障害が発生したときに、指定したメールアドレスに通知を送信し、正常時にも状況を確認できるようになります。
目次
- スクリプトの全体構造
- 各部分の解説
- 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
を利用し、管理者がいち早く障害を検知できる環境を作りましょう。
コメント