2018.11.30 : スクリプトが要件どおり動かない箇所があったので修正
目標
インターネットに出られるけれど、インターネットから入ってこれないサーバの死活監視を、お気軽にしたい。
知識材料
- curl - How To Use 対象URLを検証
- HTTP レスポンス状態コード - HTTP | MDN サーバが返送する状態コード
- Man page of CRONTAB スクリプトの定時実行
今回のゴール
監視対象URLに対して、下記の要件で監視できるシェルスクリプトを作成
- HTTP 200 OK 以外を返した時、エラー通知する
- 1日一回、監視していることを通知するために HTTP 200 OK を返した時も通知する
- (おまけ:通知先は Slack)
実践
監視シェルスクリプト
書式
check_http.sh [-f] target_url
オプション
-f target_url から HTTP 200 OK
が返ってきた時も、通知する
スクリプト
check_http.sh
# !/bin/bash
## 引数が2つより多かったらスクリプトを実行しない
if [ $# -gt 2 ]; then
exit 0
fi
## 検証するURL
target_url=""
## 通知するかどうかフラグ
NOTIFY=0
## スクリプトへの引数を確認
for arg in "$@" ; do
case "$arg" in
-f)
NOTIFY=1;;
*)
target_url=$arg
esac
done
## target_url へのアクセスを試みる
message=`curl -o /dev/null -s -w %{http_code} $target_url`
## 強制送信じゃない、またはcurl 結果 http_code が 200 だったらスクリプト終了
if [[ $NOTIFY -eq 0 && "$message" =~ 200 ]]; then
exit 0
fi
... 以下、通知先へ飛ばす処理 ...
(おまけ:監視シェルスクリプト に Slack 送信部分追加)
check_http.shの続き
## 通知メッセージ整形
message="check URL:[$target_url] status:[${message}]"
pre='```'
payload=`echo -e "> 死活監視\n${pre}\n${message}\n${pre}"`
payload="text=${payload}"
## Slack incomming webhook URL に送信
curl --data-urlencode "${payload}" \
--data-urlencode "icon_emoji=:dizzy:" \
--data-urlencode "username=webMaster" \
"https://hooks.slack.com/services/TAAAAAAAA/BBBBBBBBBB/xxxxxxxxxxxxxxxxxxxxx" > /dev/null
cron 設定
- 朝9時に、死活監視をしていることを通知。
- 毎分、死活監視。異常があったら通知。
0 9 * * * /root/cron/check_http.sh -f https://qiita.com/
*/1 * * * * /root/cron/check_http.sh https://qiita.com/
朝9時に実行されるコマンドには -f
をつけて HTTP 200 OK
が返ってきても通知する。
まとめ
世の中に、便利なサーバー監視ツールは多数存在すると思いますが、最低限「動いているか」を確認できればいいと割りきったら、お手軽に実装できました。
POST して通知できる WebService がネットワーク内に存在していれば、slack だけでなく、いろいろな通知先に切り替えられると思います。
参考にさせていただきました
cURLでHTTPステータスコードだけを取得する- Qiita
SlackのIncoming Webhooksを使い倒す - Qiita
シェルスクリプトの基礎知識まとめ - Qiita