シェルスクリプト、おもしろいです。
会社で利用しているサーバで、「各ユーザーが利用しているWeb領域の容量を監視したほうがいい」、ってことになりそうだったのでシェルスクリプトを作ってみました。
ちなみに、サーバは、
- ディストリビューションはCentOS5.3
- バーチャルホスト運用
- 各ユーザー用の公開ディレクトリは/home/user/public_html/
- Webサービスを利用しないユーザーも存在する
※このユーザー達は共通のサブグループに属している
こんな条件です。
で、できあがったスクリプトはこちら。
【homeCheck.sh】
#! /bin/sh
# バーチャルホストサーバ容量監視スクリプト
#
# クライアントが利用しているWeb領域の使用量を確認し、
# しきい値を超えている場合はメールで通知します。
#------------------------------#
# 変数定義 #
#------------------------------#
# バーチャルホストを利用しているディレクトリを指定します。
# 例) '/home' , '/htdocs'
HOME='/home'
# 監視対象外のgroupを指定します。
# ※複数指定したい場合は下記のように指定します。
# 例) '\(hoge\|fuga\)'
GROUP='hoge'
# しきい値を指定します。
# ※単位はMB(メガバイト)です。
LIMIT=1000
#------------------------------#
# 関数定義 #
#------------------------------#
msg() {
host=`hostname`
today=`date +%Y%m%d`
fromadd="fromadd@paz-para.com"
toadd="toadd@paz-para.com"
sub="[DiskUsageCheck]${host}_${today}"
cat << _EOT_ | /usr/lib/sendmail -t
Return-Path: <${fromadd}>
From: ${host}_admin
To: $toadd
Subject: $sub
DiskUsage Over $LIMIT MB!!
--------------------
UserName : $1
DiskUsage : $2 MB
--------------------
_EOT_
}
#------------------------------#
# 実行処理 #
#------------------------------#
for i in `ls $HOME`
do
# ユーザーが存在するか確認します。
# 存在しない場合は処理をスキップします。
id $i > /dev/null 2>&1
[ $? -ne 0 ] && continue
# 指定したグループに所属しているか確認します。
# 所属していた場合は処理をスキップします。
groups $i | grep $GROUP > /dev/null 2>&1
[ $? -eq 0 ] && continue
# 該当ユーザーに公開ディレクトリ(public_html)が存在するか確認します。
# 存在しない場合は処理をスキップします。
[ -d ${HOME}/$i/public_html ] || continue
# 監視対象ディレクトリの容量を確認します。
# しきい値を越えている場合はメールを送信します。。
disk=`du -ms ${HOME}/$i/public_html | sed -e 's/^\([0-9]*\).*/\1/'`
[ $disk -ge $LIMIT ] && msg $i $disk
done
exit
コメントアウトだらけになりましたが、これなら後で見てもわかるはず。
これをCronに設定しておけば、しきい値を超えている場合はユーザー名と実際の使用量が書かれたメールが送信されます。
メール送信部分を関数にしてみましたが、これだけでもけっこースッキリするもんですね。
sedコマンドはあまり使ったことありませんでしたが、正規表現と併用すると便利すぎ。
この辺もまた時間があるときにまとめたいと思います。
ついでに、気がつけば200エントリ達成。
よく続いたなーと。暇なんだなーと。。。
#1 by lax at 2月 27th, 2010
200エントリおめでとう!
今後も楽しみにしてます!
#2 by paz at 2月 27th, 2010
>>lax先輩
ありがとうございます!
まだまだ続けますよw