ログファイルをローテートする

#!/bin/sh
#lotatelogs.sh
#/var/log 内のログファイルをローテートする
#ローテーションのスケジュールをログファイルごとに指定できるよう設定ファイルを用意する
#設定ファイルでは次の書式でローテートの間隔を指定する。単位は日数。
# logfilename=duration
#設定ファイルに記述のないログファイルについてはデフォルトのローテーションの間隔は7日

logdir="/var/log"
config="/var/log/rotatelogs.conf"
mv="/bin/mv"
default_duration=7
duration=$default_duration

if [ ! -f $config ]; then
    echo "$0: no config file found. Can't proceed." >&2
    exit 1
fi

if [ ! -w $logdir -o ! -x $logdir ]; then
    echo "$0: you don't have the appropriate permissions in $logdir" >&2
    exit 1
fi

cd $logdir

for name in $(find . -type -size +Oc ! -name '*[0-9]*' \
            ! -name '\.*' ! -name '*conf' -maxdepth 1 -print | \
            sed 's/^\.\///'); do
    count=$(( $count + 1 ))

    #設定ファイルで該当するエントリを調べる
    duration="$(grep "^${name}=" $config | cut -d= -f2)"

    if [ -z $duration ]; then
        duration=$default_duration
    elif [ "$duration" = "0" ]; then
        echo "Duration set to zero: skipping $name"
        continue
    fi

    back1="${name}.1"
    back2="${name}.2"
    back3="${name}.3"
    back4="${name}.4"

    #ログファイルを最後にローテートしてから指定された
    #日数が経過していない場合はローテートしない
    if [ -f "$back1" ]; then
        if [ -z $(find $back1 -mtime +$duration -print 2>/dev/null) ]; then
            echo -n "$name's most recent backup is more recent then $duration "
            echo "days: skipping"
            continue
        fi
    fi

    echo "Rotating log $name (using a $duration day schedule)"
    
    #最も古いファイルから順にローテートする
    if [ -f "$back3" ]; then
        echo "... $back3 -> $back4"
        $mv -f "$back3" "$back4"
    fi
    if [ -f "$back2" ]; then
        echo "... $back2 -> $back3"
        $mv -f "$back2" "$back3"
    fi
    if [ -f "$back1" ]; then
        echo "... $back1 -> $back2"
        $mv -f "$back1" "$back2"
    fi
    if [ -f "$name" ]; then
        echo "... $name -> $back1"
        $mv -f "$name" "$back1"
    fi

    touch "$name"
    chmod 0600 "$name"
done

if [ $count -eq 0 ]; then
    echo "Nothing to do: no log files big enough or old enough to rotate"
fi

exit 0
#lotatelogsの設定ファイル
#書式: name=duration
#nameには /var/log ディレクトリ内のログファイルの名前を指定する
#duration の単位は日数

ftp.log=30
last.log=14
lookupd.log=7
lpr.log=30
mail.log=7
netinfo.log=7
secure.log=7
statistics=7
system.log=14
#duration が0の場合はローテーションしない
wtmp=0