df (1) の結果を awk (1) でチェックして必要であればメイル送信するだけの単純なスクリプトです。
このスクリプトを cron (8) に登録する事で定期的にディスクの容量チェックが可能です。
「ログやゴミなどでディスクが一杯になってサービスが停止した」という事故は意外と多発しているので、その様な問題を未然に防ぐために簡単に作って実行できるスクリプトは非常に重宝します。
このスクリプトではパスフレーズ無しのホストキー認証を設定した状態で ssh (1)を使用してリモートホストにアクセスしています。
Linux で動作する GNU df の挙動がオリジナルとは異なっていたので、 df (1) のオプション指定は POSIX の範疇から逸脱しています (残念)
#!/bin/sh
# ログファイル
logfile="/var/log/${0##*/}.log"
# 警告メイルの送信元アドレス
from=admin@example.com
# 警告メイルの送信先アドレス
to=mitz@example.com
# 一時ファイル
tmpfile=${TMP:-/tmp}/${0##*/}.$$
# ssh コマンド(ポートを変更してホストキー認証としてあります)
ssh="/usr/bin/ssh -p 10022"
# logger(1)
logger="/usr/bin/logger"
# df(1)
df="LANG=C df -hlP -t ext3 -t ext4"
# 監視対象となるホスト名
remote="host1 host2 host3 …"
# 監視対象となるドメイン名
domain="example.com"
# for debug
exec > /tmp/rdf.log 2>&1
date
set -x
#
# メイル送信
#
warning()
{
LANG=C
subject="##### [ ${1}: Disk Usage ] #####"
${logger} "${subject}"
# sendmail に -t を指定する事で宛先などをメイル本文から取得する
cat << EOF | /usr/sbin/sendmail -t -i
From: ${from}
To: ${to}
Subject: ${subject}
${1} disk usage warning!
`date`
`cat ${2}`
EOF
}
trap 'rm -r ${tmpfile}; exit' 0 1 2 3 9 13 15
# メイン処理
for i in ${remote}
do
# df の結果を標準出力と ${tmpfile} に同時に出力
${ssh} ${i}.${domain} ${df} | tee ${tmpfile} |
awk '{
# 2行目以降について処理する (dfの出力の1行目はヘッダ情報なのでスキップ)
if(NR > 1)
# 後ろから2番目のフィールドがディスクの使用量 (%) なので閾値との比較結果を取得
ret += $(NF-1) > '${1:-80}';
}
END {
# 結果通知
exit ret
}' || warning ${i} ${tmpfile}
done