本文へスキップ
BecomeCoder

シェルスクリプトコース · 第9章 実践 · レッスン42

監視スクリプト ― 異常を見つけて知らせる

ブラウザで完結

導入

「エラーが一定数を超えたら知らせてほしい」。これができると、人が定期的に画面を見に行く必要がなくなります。監視スクリプトの骨格は、測る → しきい値と比べる → 知らせるの3段だけです。

説明

第4章の条件分岐と、第6章の関数が主役です。

#!/bin/bash
set -eu

LOG_FILE=/home/user/logs/app.log
THRESHOLD=1

# 通知(本番ではメールやSlackへ送る部分)
notify() {
  echo "[ALERT] $1"
}

check_errors() {
  local count
  count=$(grep -c ERROR "$LOG_FILE" || true)
  echo "$count"
}

ERROR_COUNT=$(check_errors)
echo "エラー件数: $ERROR_COUNT(しきい値: $THRESHOLD)"

if [ "$ERROR_COUNT" -gt "$THRESHOLD" ]; then
  notify "エラーが $ERROR_COUNT 件発生しています"
  exit 1
fi

echo "正常範囲です"
exit 0

設計のポイントを3つ。

  • しきい値を変数にするTHRESHOLD)。現場で必ず調整することになる値は、先頭に出しておく
  • 通知処理を関数に分けるnotify)。いまは echo でも、あとで mailcurl(Slack通知)に差し替えられる
  • 異常なら exit 1 で終わる。cron や監視ツールが「失敗した」と認識できる
flowchart TD
    A["ログを測る"] --> B{"しきい値を超えた?"}
    B -->|"はい"| C["notify で知らせる"] --> D["exit 1(異常終了)"]
    B -->|"いいえ"| E["正常メッセージ"] --> F["exit 0(正常終了)"]

grep -c は「一致した行数」を返します。|| true を付けているのは、1件も見つからないと grep が終了ステータス 1 を返し、set -e で止まってしまうからです(第7章)。正常な「0件」を異常として扱わないための一手間です。

これを */5 * * * * で cron に登録すれば、5分おきの死活監視になります。第8章で学んだ flock で多重起動を防ぎ、>> /home/user/monitor.log 2>&1 でログを残せば、そのまま運用に載せられます。

やってみよう

スクリプトを実行して、app.log にエラーが2件あるためアラートが出ることを確かめましょう。次に THRESHOLD=5 に変えて実行すると、しきい値を下回るので 正常範囲です になります。同じスクリプトで、判定基準だけを運用に合わせて変えられることを体感してください。

演習

THRESHOLD5 に変えて実行し、正常範囲です と表示させてください。

ヒント1を見る

エディタの THRESHOLD=1THRESHOLD=5 に書き換えます。

ヒント2を見る

app.log のエラーは2件なので、しきい値5なら正常判定になります。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

シェルスクリプト(シミュレート)

スクリプトを書くエディタと、それを動かす仮想シェルを読み込みます(本物のbashではなく、動きを再現した学習用の環境です)。
スクロールして表示された時点でも自動で読み込まれます。