rsyncでバックアップ

昔業務系システムを自分で管理していた時代はtarをcronで定期実行していましたが、コンテンツ系システムだとファイル数が非常に多く、差分バックアップを使わないとディスクスペースや処理時間がかかってしまうのでrsyncを使ってローカルに差分バックアップをとるようにしてみました。
本当はディスクシステムを使ったスナップショットやらちゃんとした市販ソフトの適応を検討するべきなのでしょうが小規模ならばこれでもよいかなと。

とりあえず動いているみたいなので置いておきます。OSはcentos5.5です。
rsyncエラー時の処理はテストしてみていません。

サンプルコード

#!/bin/bash 
# 
# rsyncを使った差分バックアップ 
#  $BACKUPDIR配下にbackup0〜backup$BACKUPGENのフォルダ名でバックアップ 
#  backup0が最新バックアップで実行する毎にbackupフォルダをずらす   
#  backup日時はフォルダの日時で判別可能なので特に取らない 
#  rsyncの差分はbackup1とバックアップ対象を比較 
#  backup0が存在していない場合はフルバックアップ 
# 

#--- 設定 --- 
#バックアップ履歴数 
BACKUPGEN=4 
#バックアップ対象 
BACKUPFROMDIR="/var/www/moodle01" 
#バックアップ先フォルダ 
BACKUPDIR="/backup" 

#前準備 
echo "`date` backup start" 

CNT=$BACKUPGEN 
while [ $CNT -ge 0 ] 
do 
     if [ $CNT -eq $BACKUPGEN ] 
     then 
          # 最後の1つを削除 
          if [ -d $BACKUPDIR/backup$CNT ]; then 
               echo "rm -fr $BACKUPDIR/backup$CNT" 
               rm -fr $BACKUPDIR/backup$CNT 
          fi 
     else 
          MVCNT=`expr $CNT + 1` 

          #バックアップディレクトリをずらす 
          if [ -d $BACKUPDIR/backup$CNT ] 
          then 
               echo "mv $BACKUPDIR/backup$CNT $BACKUPDIR/backup$MVCNT" 
               mv $BACKUPDIR/backup$CNT $BACKUPDIR/backup$MVCNT 
          fi 
     fi 
     CNT=`expr $CNT - 1` 
done 
#rsync準備 
RSYNCCMD="rsync -av --delete" 

if [ -d $BACKUPDIR/backup1 ]; then 
     #backup1との差分をbackup0にバックアップ 
     echo "$RSYNCCMD --link-dest=../backup1 $BACKUPFROMDIR $BACKUPDIR/backup0" 
     $RSYNCCMD --link-dest=../backup1 $BACKUPFROMDIR $BACKUPDIR/backup0 
else 
     #初回のフルバックアップ 
     echo "$RSYNCCMD $BACKUPFROMDIR $BACKUPDIR/backup0" 
     $RSYNCCMD $BACKUPFROMDIR $BACKUPDIR/backup0 
fi 
code=$? 
if [ $code -ne 0 ]; then 
        mail -s "BACKUP NG CODE IS $code" root 
     exit 1 
fi 
echo "`date` backup end" 

exit 0 

余談

あと久々にsh弄るとけっこう忘れていてショックが大きかった・・・。久々に下記の本を引っ張り出して書いていました。
もともとWebアプリよりはクラサバ系のアプリをUNIXで組んでいたので、linuxを初めて使ったとき、各種資源がどう扱われるのか知りたくてこの本を買いましたが、今でも十分通用する良書かと思います。
Webだけやるならここまでのことを知らなくともどうにでもなりますが、このあたりをちゃんと知っているエンジニアはトラブルシューティング能力が段違いですね。こういった要素がちゃんと評価される世の中になってほしいです。

Linuxプログラミング―例題で学ぶUNIXプログラミング環境のすべて

Linuxプログラミング―例題で学ぶUNIXプログラミング環境のすべて