サーバを運用していると遅かれ早かれやってくる問題が、ディスクの空き容量がなくなることだ。ファイルサーバを使っているなら結構な早さでやってくるし、そうでなくても、ログファイルのローテーション設定が甘いせいでいつの間にかディスクが圧迫されているとか、無頓着なユーザーがサイズの大きなファイルを置いたために一気に空き容量が減るとかいったことがいずれ発生する。

このディスクの空き容量は、dfコマンドでチェックできる。dfコマンドの出力はOSごとに異なるが、大体次のような感じになっている。

●FreeBSDの場合

% df -H
Filesystem    Size    Used   Avail Capacity  Mounted on
/dev/da0p2     29G     24G    3.0G    89%    /
devfs         1.0k    1.0k      0B   100%    /dev
procfs        4.1k    4.1k      0B   100%    /proc
map -hosts      0B      0B      0B   100%    /net
map -media      0B      0B      0B   100%    /media
%

●CentOSの場合

# df -H
ファイルシス                   サイズ  使用  残り 使用% マウント位置
/dev/mapper/centos_centos-root    32G  1.9G   30G    6% /
devtmpfs                         954M     0  954M    0% /dev
tmpfs                            965M     0  965M    0% /dev/shm
tmpfs                            965M  8.7M  957M    1% /run
tmpfs                            965M     0  965M    0% /sys/fs/cgroup
/dev/vda1                        521M  265M  257M   51% /boot
tmpfs                            193M     0  193M    0% /run/user/0
#

dfコマンドは、マウントポイントごとに使用量や空き容量を出力してくれる。-Hオプションは、人間が読みやすいように単位を付けて出力するためのものだ。出力を目視で確認する場合は、このオプションを指定して実行するほうが使いやすいだろう。

マウントポイントや出力される内容についてはOSやファイルシステムごとに違うので一概には言えないが、モニタリングしたいディレクトリが含まれているファイルシステムに絞り込み、その使用率をチェックするのがよいかと思う。

このdfコマンドは、次のようにマウントポイントを指定すると、指定した部分だけを出力させることができる。

# df /
ファイルシス                   1K-ブロック    使用   使用可 使用% マウント位置
/dev/mapper/centos_centos-root    30881044 1761532 29119512    6% /
#

ディスクの使用率だけを見たいなら、tailコマンドを使ってまずヘッダ部分を取り除く。

# df / | tail -1
/dev/mapper/centos_centos-root    30881044 1761532 29119512    6% /
#

次にawkコマンド辺りを使って使用率の部分だけを出力させる。例えば、以下のようにawkコマンドを実行すると5列目だけが出力される。

# df / | tail -1 | awk '{print $5}'
6%
#

自動処理させたい場合には「%」があると扱いにくい。trコマンドで「%」を削除すると、使用率を数字だけでチェックできる。

# df / | tail -1 | awk '{print $5}' | tr -d '%'
6
#

ここまで取り出せば、後は使用率が一定のしきい値を超えたら管理者にメールで通知するようなシェルスクリプトを簡単に組めるだろう。例えば、マウントポイントが「/」のファイルシステムの使用率が80%を超えたら管理者に警告メールを出すシェルスクリプトを書くとすれば、次のような感じになる。

#!/bin/sh

limit=80
cap=$(df / | tail -1 | awk '{print $5}' | tr -d '%')

if [ $limit -lt $cap ]
then
        printf 'CAPACITY !!WARNING!! - %d%%\n\n' $cap           |
        mail -s 'CAPACITY !!WARNING!!' メールアドレス
fi

しきい値を超えると、こんな感じで警告メールが送られてくる。

先のシェルスクリプトで、しきい値を超えると送られてくる警告メール

これをcronに仕込んで毎日1回チェックするようにすれば、管理者が毎日ログインしてコマンドを実行するといった必要がなくなる。管理サーバの数が増えてきたらなおさら、こうしたチェックスクリプトを用意して管理者の手間を減らしたい。

先のシェルスクリプトで使っているコマンドは、どれもこれまでの連載で取り上げてきたコマンドだ。もし使い方がわからない場合は、以前の記事を読んで復習するとよいだろう。このように、いろいろなコマンドを知れば知るほど、自動的に処理できることが増える。将来の「手抜き」のために、ぜひ役立つコマンドを覚えていっていただきたい。