概要
ZABBIX や Nagios 等の監視ツールを用意するまでもなく、ただサイトにアクセスしてレスポンスコードが 200 じゃなかったら指定したメールアドレスに通知するシェルスクリプト。
必要なもの
curl と sendmail(/usr/sbin/sendmail)。
コード
#!/bin/bash ### ### [サイト稼働監視スクリプト] ### 指定した URL にアクセスし、レスポンスコードが 200 じゃなかったらメールで通知する。 ### ### USAGE(crontab): 毎時30分にチェックする例。 ### 30 * * * * sh /path/to/check_web.sh https://example.com/ ### ### オプション: -f をつけると正常時(200)でも通知する。 ### $ sh check_web.sh -f https://example.com/ ### ## 通知設定 ### 通知先アドレス TO="[email protected]" ### 差出人アドレス FROM="[email protected]" ## スクリプト自身のパスへ移動 cd $(dirname "${0}") ## Log ファイルのパス LOGFILE="./log/$(date +%Y-%m).log" ### Log ディレクトリがなければ作成 if [ ! -d ./log ]; then mkdir ./log fi ## 引数が2つより多かったらスクリプトを実行しない if [ $# -gt 2 ]; then exit 0 fi ## 検証するURL TARGET_URL="" ## 通知するかどうかフラグ(0:正常時は非通知/1:常に通知) NOTIFY=0 ## スクリプトへの引数を確認 for ARG in "$@" ; do case "${ARG}" in -f) NOTIFY=1;; *) TARGET_URL=${ARG} esac done ## 検証した日時 CHECK=$(date +"%Y-%m-%d %H:%M:%S") ## TARGET_URL へのアクセスを試みる MESSAGE=$(curl -o /dev/null -s -w %{HTTP_CODE} ${TARGET_URL}) ## ロギング echo "${CHECK}:${TARGET_URL}:${MESSAGE}" >> ${LOGFILE} ## 強制送信じゃない、または curl 結果 http_code が 200 だったらスクリプト終了 if [[ ${NOTIFY} -eq 0 && "${MESSAGE}" = 200 ]]; then exit 0 fi ## メール通知 SUBJECT="[Check web] ${TARGET_URL}" Msg() { echo "To:${TO} Subject: ${SUBJECT} MIME-Version: 1.0 Content-Type: Text/Plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit ${TARGET_URL} へのリクエストが下記のレスポンスコードでした。 確認してください。 レスポンスコード:${MESSAGE} チェック日時:${CHECK} " } ## main Msg | /usr/sbin/sendmail -f${FROM} ${TO} exit 0 # EOF