Zenn
🚨

VPSとWebサイトをSlackで監視するシンプルな仕組み(bash + cron)

2025/03/25に公開
1

はじめに

自分のVPSやクライアントのWebサイトが「落ちている」「接続できない」という状態をすぐに知りたい場面は多いはず。

そんなとき、シンプルなbashスクリプト + cron + Slack Webhookだけで、低コストな監視環境を構築できます。


この方法でできること

  • VPSが正常に立ち上がっているか(pingで確認)
  • Webサービスが実際に接続できるか(curlで確認)
  • Slack Webhookによる速報
  • ログファイルに記録
  • 古いログは自動清除

Slack Webhookを用意

Slackの通知には Incoming Webhooks を利用します。

  1. Slackチャンネルを指定してWebhookを設定
  2. 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が増えてきたら、共通化やテンプレート化するのも良さそうです。

1

Discussion

ログインするとコメントできます