バックアップシェルを作ってみた


また何かのときに使えるかもしれないのでメモ。

ちまたにはバックアップソフトを買うだとかするようですが、rsync コマンドを使ってクーロンで動かせば基本的なことは足りてしまう。以下、バックアップサーバ(バックアップファイルをためるサーバ)にてクーロンでまわしているシェルの基本部分抜粋。

参考にしたのはいつもお世話になっているところからココ。ただ、バッククライアント側で rsync を実施しているので、こちらの方法は異なる。

動作の特徴

  • バックアップサーバから rsync コマンドを使ってファイル/ディレクトリを取得</p>
    • プロトコルは ssh を使ってパスワードなし key を使う
  • バックアップ先は list に記述
    • 記述例) 192.168.0.100://root/backup
  • バックアップ保存先は仮で /home/backup 配下にしている
    • 最新のバックアップファイル/フォルダは new ディレクトリに保存
    • 前日以降分は biz2 で圧縮して old ディレクトリへ移動
  • old ディレクトリ内の圧縮ファイルは365日経過したら削除
  • 処理の詳細は /var/log/backup.log に記述
  • 処理でエラーしたら root あてのメールが飛ぶ


#!/bin/bash



LANG=C



# 設定開始



USER=backup

# バックアップ対象リスト名

BACKUPLIST=/home/$USER/script/list

[ ! -s $BACKUPLIST ] && echo "$BACKUPLIST is not found" && error_exit



# バックアップ先ディレクトリ名

# 最新 new, 過去分 old

BACKUPDIRNEW=/home/$USER/backup-files/new

BACKUPDIROLD=/home/$USER/backup-files/old

mkdir -p $BACKUPDIRNEW

mkdir -p $BACKUPDIROLD



# バックアップ保存世代数

# ※当日分を含めた過去分バックアップを保存する世代数

# ※過去分バックアップを保存しない場合は1を指定する

BACKUPGEN=365



# バックアップログファイル名

BACKUPLOG=/var/log/backup.log



# 異常終了処理関数定義

error_exit () {

exit 1

}



# バックアップログファイル作成

# 1回分のみ保持

rm -f $BACKUPLOG

if [ ! -f $BACKUPLOG ]; then

touch $BACKUPLOG

chmod 644 $BACKUPLOG

fi



# バックアップファイルの履歴

# 新しいファイルは new

# 前のファイルはoldディレクトリ以下に日付入りの圧縮ファイルにする

cd $BACKUPDIRNEW

LINECOUNT=`ls |wc -l 2>/dev/null`

echo "#### `date` backup start ####" >> $BACKUPLOG

if [ $LINECOUNT -ne  ]; then

TIMESTAMP=`date +%y%m%d-%H%M%S`

tar jcvfP $BACKUPDIRNEW/${TIMESTAMP}backup.tar.bz2 $BACKUPDIRNEW >> $BACKUPLOG 2>&1

mv $BACKUPDIRNEW/${TIMESTAMP}backup.tar.bz2 $BACKUPDIROLD/ > /dev/null 2>&1

fi



# バックアップ実行

# key にて ssh rsync パスワードなし

while read LINE

do

rsync -avz --delete -e "ssh -i /home/$USER/.ssh/id_rsa" $USER@$LINE $BACKUPDIRNEW/ >> $BACKUPLOG 2>&1

done < $BACKUPLIST

code=$?

if [ $code -ne  ]; then

cat $BACKUPLOG | mail -s "BACKUP NG CODE IS $code" root

error_exit

fi

echo "#### `date` backup end ####" >> $BACKUPLOG



# バックアップ保存世代を超えた古いバックアップを削除

if [ $(ls $BACKUPDIROLD/ |wc -l) -gt $BACKUPGEN ]; then

OLDBACKUPCNT=`expr $(ls $BACKUPDIROLD/ |wc -l) - $BACKUPGEN`

for file in `ls -t $BACKUPDIROLD/ |tail -n $OLDBACKUPCNT`

do

rm -f $BACKUPDIROLD/$file

done

fi

</div>