Bash を使って Linux システムモニターを構築する

LinuxBeginner
オンラインで実践に進む

はじめに

このプロジェクトでは、シェルスクリプトを使って Linux システムモニタを作成します。このスクリプトは、システムの CPU、メモリ、およびディスクの使用状況を継続的に追跡し、使用割合をリアルタイムで表示します。どのリソースの使用量が事前に設定されたしきい値を超えた場合、警告が表示されます。このプロジェクトを完了することで、実用的なツールを構築しながら、Linux スクリプティングの基本的なスキルを学ぶことができます。

Linux System Monitor

🎯 タスク

このプロジェクトを完了することで、次のことができます。

  • システムリソースを監視するためのシェルスクリプトを作成する方法を学ぶ。
  • CPU、メモリ、およびディスクの使用量に対するしきい値を設定して使用する方法を理解する。
  • しきい値を超えたときに警告を送信する関数を作成する。

🏆 成果

このプロジェクトを完了した後、次のことができます。

  • シェルスクリプトを使って Linux システムモニタを作成して実行することができる。
  • topfree、およびdfなどのシステムリソースコマンドを使う方法を理解する。
  • 電子メール通知などの新機能を追加することで、スクリプトを拡張する準備ができている。

プロジェクトのセットアップ

まず、スクリプト用のクリーンなワークスペースを用意します。このプロジェクトでは、コーディングとスクリプトのテストに適している WebIDE をおすすめします。

このディレクトリに移動して、system_monitor.sh という名前のファイルを作成します。

cd ~/project
touch system_monitor.sh
Creating system monitor script

好きなテキストエディタでファイルを開き、次の行を追加します。

#!/bin/bash

## Define the threshold values for CPU, memory, and disk usage (in percentage)
CPU_THRESHOLD=80
MEMORY_THRESHOLD=80
DISK_THRESHOLD=80

コードの各部分の機能は以下の通りです。

  • #!/bin/bash:この行は、スクリプトが Bash シェルを使って解釈されることを指定します。
  • CPU_THRESHOLD=80:CPU 使用率のしきい値を 80% に設定します。後でこの値を調整できます。
  • MEMORY_THRESHOLD=80DISK_THRESHOLD=80:同様に、これらはメモリとディスクの使用量のしきい値を定義します。

ファイルを保存して実行可能にします。

chmod +x system_monitor.sh

警告機能の追加

次に、リソースの使用量がしきい値を超えたときに警告を送信する関数を追加しましょう。system_monitor.sh を開いて、次のコードを追加します。

## Function to send an alert
send_alert() {
  echo "$(tput setaf 1)ALERT: $1 usage exceeded threshold! Current value: $2%$(tput sgr0)"
}

この関数の解説を以下に示します。

  • send_alert:この関数は 2 つの引数を取ります。
    • $1 はリソースの種類(例:CPU、メモリ、ディスク)を表します。
    • $2 は現在の使用率を表します。
  • tput setaf 1:警告を視覚的に区別するために、テキストの色を赤色に変更します。
  • tput sgr0:警告メッセージの後、テキストの書式を通常にリセットします。

関数が機能することを確認するために、関数へのテスト呼び出しを追加します。

send_alert "CPU" 85
alert function code snippet

スクリプトを実行します。

./system_monitor.sh

以下のような赤色の警告メッセージが表示されるはずです。

ALERT: CPU usage exceeded threshold! Current value: 85%

次のステップに進む前に、スクリプトから send_alert へのテスト呼び出しを削除します。

CPU 使用率の監視

CPU 使用率を監視するロジックを追加しましょう。スクリプトを開いて、次のコードを追加します。

## Monitor CPU usage
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
cpu_usage=${cpu_usage%.*} ## Convert to integer
echo "Current CPU usage: $cpu_usage%"

if ((cpu_usage >= CPU_THRESHOLD)); then
  send_alert "CPU" "$cpu_usage"
fi

このコードでは以下のことが起こります。

  1. top -bn1:1 回の反復でバッチモードで top コマンドを実行して、リアルタイムの CPU 統計情報を取得します。
  2. grep "Cpu(s)":出力をフィルタリングして、CPU 使用率の行に焦点を当てます。
  3. awk '{print $2 + $4}':ユーザーとシステムの CPU 使用率のパーセンテージを抽出して合計します。
  4. cpu_usage=${cpu_usage%.*}:小数点以下を取り除いて、しきい値の比較を簡略化します。
  5. if ((cpu_usage >= CPU_THRESHOLD)):CPU 使用率をしきい値と比較し、超えた場合に send_alert を呼び出します。

CPU 監視をテストするために、スクリプトを実行します。

./system_monitor.sh

CPU 使用率が表示されるはずです。しきい値を超えている場合、警告が表示されます。

メモリ使用率の監視

次に、メモリ使用率を監視するコードを追加します。CPU 監視ロジックの下に次の行を挿入します。

## Monitor memory usage
memory_usage=$(free | awk '/Mem/ {printf("%3.1f", ($3/$2) * 100)}')
echo "Current memory usage: $memory_usage%"
memory_usage=${memory_usage%.*}
if ((memory_usage >= MEMORY_THRESHOLD)); then
  send_alert "Memory" "$memory_usage"
fi

このコードの動作方法は以下の通りです。

  1. free:メモリ使用率の統計情報を提供します。
  2. awk '/Mem/ {printf("%3.1f", ($3/$2) * 100)}':使用済みメモリ ($3) を総メモリ ($2) で割ることで、使用中のメモリの割合を計算します。
  3. スクリプトは memory_usage をしきい値と比較し、必要に応じて警告を送信します。

スクリプトを実行します。

./system_monitor.sh

メモリ使用率のパーセンテージが表示され、使用率がしきい値を超えると警告がトリガーされます。

ディスク使用率の監視

次に、ディスク使用率を監視しましょう。メモリ監視ロジックの下に次のコードを追加します。

## Monitor disk usage
disk_usage=$(df -h / | awk '/\// {print $(NF-1)}')
disk_usage=${disk_usage%?} ## Remove the % sign
echo "Current disk usage: $disk_usage%"

if ((disk_usage >= DISK_THRESHOLD)); then
  send_alert "Disk" "$disk_usage"
fi

解説:

  1. df -h /:ルートディレクトリのディスク使用率の統計情報を取得します。
  2. awk '/\// {print $(NF-1)}':使用率のパーセンテージの列を抽出します。
  3. disk_usage=${disk_usage%?}:比較を容易にするために % 記号を削除します。
  4. ディスク使用率がしきい値を超えると、警告がトリガーされます。

スクリプトを実行します。

./system_monitor.sh

ディスク使用率の統計情報が表示され、必要に応じて警告がトリガーされます。

すべてをループにまとめる

最後に、CPU、メモリ、およびディスクの監視をループに組み合わせて、継続的な監視を行います。既存のコンテンツを以下のものに置き換えます。

while true; do
  ## Monitor CPU
  cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
  cpu_usage=${cpu_usage%.*}
  if ((cpu_usage >= CPU_THRESHOLD)); then
    send_alert "CPU" "$cpu_usage"
  fi

  ## Monitor memory
  memory_usage=$(free | awk '/Mem/ {printf("%3.1f", ($3/$2) * 100)}')
  memory_usage=${memory_usage%.*}
  if ((memory_usage >= MEMORY_THRESHOLD)); then
    send_alert "Memory" "$memory_usage"
  fi

  ## Monitor disk
  disk_usage=$(df -h / | awk '/\// {print $(NF-1)}')
  disk_usage=${disk_usage%?}
  if ((disk_usage >= DISK_THRESHOLD)); then
    send_alert "Disk" "$disk_usage"
  fi

  ## Display current stats
  clear
  echo "Resource Usage:"
  echo "CPU: $cpu_usage%"
  echo "Memory: $memory_usage%"
  echo "Disk: $disk_usage%"
  sleep 2
done

このループは、リソースの使用状況を継続的に監視して更新し、画面をクリアし、定期的に現在のステータスを表示します。

テストするために、スクリプトを実行します。

./system_monitor.sh

まとめ

おめでとうございます!あなたは Bash を使って完全に機能する Linux システムモニターを構築しました。このツールは、CPU、メモリ、およびディスクの使用状況をリアルタイムで追跡し、使用量が事前に定義されたしきい値を超えた場合に警告を発します。メール通知や追加のリソースの監視などの機能を追加することで、スクリプトを拡張することも自由にできます。

Linux System Monitor