このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:ディスク使用量を監視するシェルスクリプト

ディスク使用量を監視するシェルスクリプト

 システム管理において、ディスクの使用量を定期的に監視することは重要です。ディスクの容量が不足すると、システムのパフォーマンス低下やデータ損失のリスクが高まります。そこで、ディスク使用量を自動的に監視し、閾値を超えた場合に警告を表示するシェルスクリプトを作成してみましょう。

ディスク使用量監視スクリプトの概要

このシェルスクリプト disk_monitor.sh は以下の機能を持ちます。

  • 監視対象ディレクトリの指定:デフォルトではルートディレクトリ / を監視しますが、コマンドライン引数で任意のディレクトリを指定できます。
  • ディスク使用量の閾値設定:デフォルトの閾値は 80% ですが、コマンドライン引数で変更可能です。
  • ディスク使用量の取得と判定:指定したディレクトリのディスク使用量を取得し、閾値を超えているか判定します。
  • 結果の表示:ディスク使用量が閾値を超えている場合は警告メッセージを、そうでない場合は正常メッセージを表示します。

スクリプトの作成から実行までの手順と解説

ステップ1:スクリプトファイルの作成

 前提条件として「シェルスクリプトの自分専用の配置場所を作る」でスクリプトを実行するためのbinディレクトリが作成され、サーチパスの設定ができているものとします。※Ubuntuの場合は、binディレクトリを作成して、ログアウトしてログインするだけで準備が整います。

サーチパスの確認

user01@ubuntu:~$ echo $PATH
/home/user01/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:
/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin:~/bin

ホームディレクトリ直下の /home/user01/bin がサーチパスにあることが確認できます。

テキストエディタの起動

 ターミナルを開き、ホームディレクトリの/binディレクトリ内にdisk_monitor.sh という名前のファイルを作成します。

user01@ubuntu:~$ nano ./bin/disk_monitor.sh

ステップ2:スクリプトの内容を記述

エディタが開いたら、以下の内容をコピーして貼り付けます。

#!/bin/bash

# 監視対象のディレクトリ(デフォルトはルートディレクトリ)
TARGET_DIR="/"
# 閾値(パーセンテージ)
THRESHOLD=80

# コマンドライン引数でディレクトリと閾値を指定可能
if [ -n "$1" ]; then
    TARGET_DIR="$1"
fi

if [ -n "$2" ]; then
    THRESHOLD="$2"
fi

# ディスク使用量を取得(% 記号を削除)
USAGE=$(df -h "$TARGET_DIR" | awk 'NR==2 {gsub("%",""); print $5}')

# 使用量が閾値を超えているか確認
if [ "$USAGE" -ge "$THRESHOLD" ]; then
    echo "警告: ディレクトリ '$TARGET_DIR' のディスク使用量が ${USAGE}% に達しています。"
else
    echo "正常: ディレクトリ '$TARGET_DIR' のディスク使用量は ${USAGE}% です。"
fi

スクリプトの解説

シェバン行

スクリプトが Bash シェルで実行されることを指定します。

#!/bin/bash

デフォルト設定

  • TARGET_DIR:監視対象のディレクトリ。デフォルトはルートディレクトリ /
  • THRESHOLD:ディスク使用量の閾値。デフォルトは 80%。
TARGET_DIR="/"
THRESHOLD=80

コマンドライン引数の処理

  • $1 が指定されていれば TARGET_DIR を上書き。
  • $2 が指定されていれば THRESHOLD を上書き。
if [ -n "$1" ]; then
    TARGET_DIR="$1"
fi

if [ -n "$2" ]; then
    THRESHOLD="$2"
fi

ディスク使用量の取得

  • df -h "$TARGET_DIR":指定ディレクトリのディスク使用状況を取得。
  • awk 'NR==2 {gsub("%",""); print $5}':2行目から使用率(%を除く)を抽出。
USAGE=$(df -h "$TARGET_DIR" | awk 'NR==2 {gsub("%",""); print $5}')

コマンドの分解

コマンド部分説明
df -h "$TARGET_DIR"ディスク使用状況を人間が読みやすい形式で表示
awk 'NR==2 { ... }'2行目(該当ディレクトリの情報)を処理
gsub("%","")% 記号を削除
print $55番目のフィールド(使用率)を出力

使用量の判定とメッセージ表示

  • 使用率が閾値以上の場合は警告メッセージを表示。
  • 閾値未満の場合は正常メッセージを表示。
if [ "$USAGE" -ge "$THRESHOLD" ]; then
    echo "警告: ディレクトリ '$TARGET_DIR' のディスク使用量が ${USAGE}% に達しています。"
else
    echo "正常: ディレクトリ '$TARGET_DIR' のディスク使用量は ${USAGE}% です。"
fi

ステップ3:スクリプトに実行権限を付与

スクリプトを保存してエディタを閉じたら、実行権限を付与します。

user01@ubuntu:~$ chmod +x ./bin/disk_monitor.sh

ステップ4:スクリプトの実行

デフォルト設定で実行

user01@ubuntu:~$ disk_monitor.sh

実行結果の例

正常: ディレクトリ '/' のディスク使用量は 56% です

ディレクトリを指定して実行

監視対象のディレクトリを /home に変更して実行します。

user01@ubuntu:~$ disk_monitor.sh /home

実行結果の例

正常: ディレクトリ '/home' のディスク使用量は 57% です。

ディレクトリと閾値を指定して実行

監視対象のディレクトリを /var、閾値を 50% に設定して実行します。

user01@ubuntu:~$ disk_monitor.sh /var 50

実行結果の例

警告: ディレクトリ '/var' のディスク使用量が 57% に達しています。

解説

  • コマンドライン引数 $1 に監視対象ディレクトリ、$2 に閾値を指定できます。
  • スクリプトは指定されたディレクトリのディスク使用量を取得し、閾値と比較します。

ステップ5:スクリプトの応用

 このスクリプトを定期的に実行することで、ディスク使用量の監視を自動化できます。例えば、cron を使用して毎日実行する設定を行うことが可能です。

cron による自動実行の設定例

1.crontab を編集します。

user01@ubuntu:~$ crontab -e
no crontab for user01 - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.tiny
  3. /bin/ed

Choose 1-3 [1]: 1

2.以下の行を追加して、毎日午前 9 時にスクリプトを実行します。

0 9 * * * /home/user01/bin/disk_monitor.sh / 80

注意

  • cron で実行する場合、スクリプト内で使用しているコマンドのパスが通っているか確認してください。
  • 結果をメールで受け取りたい場合、メール設定が必要です。

ステップ6:cronの設定解除と作成したスクリプトの削除

cronの設定解除

 crontab -e コマンドを実行して、追加した「0 9 * * * /home/user01/bin/disk_monitor.sh / 80」を削除します。

user01@ubuntu:~$ crontab -e

スクリプトの削除

演習が終わったら、作成したスクリプトを削除します。

user01@ubuntu:~$ rm ./bin/disk_monitor.sh

まとめ

このシェルスクリプトでは、以下のポイントを学びました。

  • コマンドライン引数の活用:スクリプトに引数を渡して動的に動作を変更する方法。
  • 条件分岐(if 文)の使用:引数の有無やディスク使用量に応じて処理を分岐。
  • システムコマンドの利用df コマンドと awk を組み合わせて必要な情報を取得。
  • 変数の操作:コマンド置換を使ってコマンドの結果を変数に代入。

 シェルスクリプトを活用することで、システム管理の効率化や自動化が可能になります。今回のスクリプトをベースに、メール通知機能を追加したり、定期的に実行するよう cron に設定したりと、さらなる拡張も可能です。ぜひシェルスクリプトを活用して、日々の業務を効率化してみてください。