ウェブサイトの死活監視したいんだけど、大掛かりなものは触りたくない。そんなあなたにピッタリのスクリプトです。
前提
一つだけ前提があります。
- 監視スクリプト実行しているサーバからメールが送れること
※このスクリプトはさくらインターネットの共用サーバで確認してます。
ウェブサイト死活監視スクリプト
早速シェルスクリプトです。
website-monitoring.sh
#!/bin/sh
if [ -z $1 ]; then
echo "usage $0 [host]"
exit
fi
SITE=$1
SITE_URL=https://$SITE
MAX_TIME=6 # タイムアウト値、6秒待っても反応しないならタイムアウト
ERROR_LOG=$HOME/script/log/$SITE-error.log # エラーメッセージの格納場所
NOTIFICATION_EMAIL=<通知用メールアドレス>
curl -IsSf -m $MAX_TIME -o /dev/null $SITE_URL 2> $ERROR_LOG || cat $ERROR_LOG |
mail -s "ALARM: $SITE is down" $NOTIFICATION_EMAIL
cron設定
crontab -e
(もしくは各サーバプロバイダが提供する管理画面)で次のようなcronを追加します。
*/1 * * * * <スクリプト配置パス>/website-monitoring.sh <ウェブサイトのFQDN> >/dev/null 2>&1
# 例:
*/1 * * * * $HOME/script/cron/website-monitoring.sh www.example.com >/dev/null 2>&1
これで1分おきに監視が行われます。エラーが起きた場合、ALART: www.example.com is down
というような件名と、エラー内容が本文のメールが届きます。
工夫したポイント
調べると、curlのレスポンス見て死活を知らせる書き方はすぐ出てきます。
しかし、タイムアウトならもう少し様子見でもいいし、そうじゃなければちょっと深刻かもね!といったような判断ができるように、エラー内容をメール本文に載せたかったです。
そこで、結果を一時的にファイルに書き出してmail
コマンドにパイプで渡すようにしてます。
この一時的にファイルはエラー発生する度、上書きにしてますが、もう少し丁寧にやると、例えばファイルの存在を判定して、存在しているならタイムスタンプを付けてリネームするとかで、障害の履歴として保存することも考えられます。
スクリプトのバリエーション
cronの設定が分からない・できない場合、次のようにシェル自体を無限ループにするやり方も考えられます。(※動作未検証)
website-monitoring.sh
#!/bin/sh
if [ -z $1 ]; then
echo "usage $0 [host]"
exit
fi
SITE=$1
SITE_URL=https://$SITE
MAX_TIME=6 # タイムアウト値、6秒待っても反応しないならタイムアウト
ERROR_LOG=$HOME/script/log/$SITE-error.log # エラーメッセージの格納場所
NOTIFICATION_EMAIL=<通知用メールアドレス>
while true; do
curl -IsSf -m $MAX_TIME -o /dev/null $SITE_URL 2> $ERROR_LOG || cat $ERROR_LOG |
mail -s "ALARM: $SITE is down" $NOTIFICATION_EMAIL
sleep 60
done
コメントを残す