🚨
VPSとWebサイトをSlackで監視するシンプルな仕組み(bash + cron)
はじめに
自分のVPSやクライアントのWebサイトが「落ちている」「接続できない」という状態をすぐに知りたい場面は多いはず。
そんなとき、シンプルなbashスクリプト + cron + Slack Webhookだけで、低コストな監視環境を構築できます。
この方法でできること
- VPSが正常に立ち上がっているか(pingで確認)
- Webサービスが実際に接続できるか(curlで確認)
- Slack Webhookによる速報
- ログファイルに記録
- 古いログは自動清除
Slack Webhookを用意
Slackの通知には Incoming Webhooks を利用します。
- Slackチャンネルを指定してWebhookを設定
- Webhook URL を獲得
bashスクリプトの概要
VPSチェック(ping)
サーバーが立ち上がっているかどうかを、ICMPパケットを送信するping
コマンドで確認します。
if ! ping -c 1 -W 3 "$HOST" > /dev/null; then
# DOWN時の処理
fi
Webサイトチェック(curl)
curl
を使い、HTTPステータスコードが 200 OK
かどうかでWebサイトの生殖確認をします。
if ! curl -s --max-time 10 --head "$URL" | grep "200 OK" > /dev/null; then
# DOWN時の処理
fi
curlのポイント:
-
--head
でヘッダだけ取得し軽くする -
--max-time 10
でタイムアウトを設定
cronで定期実行
0 * * * * /home/ubuntu/scripts/example/ping.sh
上記のようにcronに記述すれば、毎時自動で監視されます。
古いログの自動清除
30日より前のログを削除するスクリプト。
#!/bin/bash
LOG_DIR="/home/ubuntu/scripts/logs"
DAYS_TO_KEEP=30
CUTOFF_DATE=$(date -d "$DAYS_TO_KEEP days ago" '+%Y-%m-%d')
for LOGFILE in "$LOG_DIR"/*.log; do
if [[ -f "$LOGFILE" ]]; then
echo "🧹 Cleaning $LOGFILE"
awk -v cutoff="$CUTOFF_DATE" '$0 >= cutoff' "$LOGFILE" > "${LOGFILE}.tmp" && mv "${LOGFILE}.tmp" "$LOGFILE"
fi
done
cronに記述する例(深夜1時に実行):
0 1 * * * /home/ubuntu/scripts/clean_logs.sh
ディレクトリ構成例
scripts/
├── logs/
│ ├── site-a.log
│ └── site-b.log
├── site-a/
│ └── ping.sh
├── site-b/
│ └── ping.sh
├── clean_logs.sh
おわりに
軽量な監視を手間なしで構築できる、実際的なシンプル構成です。
サイトやVPSが増えてきたら、共通化やテンプレート化するのも良さそうです。
Discussion