rsyncで世代管理(2)

【概要】
rsyncで世代バックアップを取得するスクリプトです。
シェルスクリプト(bash)で、
CRONに登録することを想定しています。
手動実行も可能です。
(1)との違いは、世代管理用ディレクトリを取得日時基準にしていること、
rsyncの回数を1回のみにしていることです。
また、バックアップ先へSSHするようにしています。

バックアップ元からSSHでバックアップ先(リモート)にアクセスしてrsyncする想定です。
バックアップサーバ内で世代管理を行います。
※バックアップサーバを使用しない、ローカルでも使用可能です
その場合「DIR_SRC=<バックアップ元ディレクトリフルパス>」となります。
※バックアップ元へSSHするようにもできます。
その場合「DIR_SRC=<ユーザ>@:<バックアップ元ディレクトリフルパス>」、
「DIR_DST=<バックアップ元ディレクトリフルパス>」となります。

処理の流れとしては下記になります。
 ①バックアップ先ディレクトリ配下に世代管理用ディレクトリ作成(BKUP_GEN_YYYYMMDD_hhmmss)
 ②世代管理用ディレクトリを名前でソート、世代管理数を超えたものは削除
 ③コピー元をバックアップ用ディレクトリにrsync

【動作確認した環境】
Centos7.9

【前提条件】
・SSHを使用する場合はSSH公開鍵認証で接続先にパスワードなしで接続可能なこと
・SSHを使用する場合は接続元と接続先の両方にrsyncがインストールされていること

【rsyncgen2.sh】

#!/bin/bash

# rsync source directory
# / is not required at the end of the directory
# (exsample: DIR_SRC=/root/testsrcdir)
DIR_SRC=<バックアップ元ディレクトリフルパス>
# rsync destination directory
# / is not required at the end of the directory
# (exsample: DIR_SRC=/root/testdstdir)
DIR_DST=<ユーザ>@<IPアドレス>:<バックアップ先ディレクトリフルパス>

# backup generation
BKUP_GEN=<数字>

# variable initialization
NUM_DST=0
NUM_DEL=0
RC=0
YYYYMMDD_hhmmss=$(date '+%Y%m%d_%H%M%S')

# backup generation check
echo "${BKUP_GEN}" | grep -q "^[0-9]\+$"
RC=$?
if [ "${RC}" != "0" ] ; then
  /usr/bin/logger "ERROR:rsync script NUM_SRC variable error: ${BKUP_GEN}"
  exit 1
fi
if [ ${BKUP_GEN} -le 0 ] ; then
  /usr/bin/logger "ERROR:rsync script NUM_SRC variable error: ${BKUP_GEN}"
  exit 1
fi

# rsync directory check
if [ -z ${DIR_SRC} ] || [ "${DIR_SRC}" = "/" ] ; then
  /usr/bin/logger "ERROR:rsync script DIR_SRC variable error: ${DIR_SRC}"
  exit 1
fi
if [ -z ${DIR_DST} ] || [ "${DIR_DST}" = "/" ] ; then
  /usr/bin/logger "ERROR:rsync script DIR_DST variable error: ${DIR_DST}"
  exit 1
fi


# mkdir backup direcotry
mkdir -p ${DIR_DST}/BKUP_GEN_${YYYYMMDD_hhmmss}
RC=$?
if [ "${RC}" != "0" ] ; then
  /usr/bin/logger "ERROR:mkdir: ${DIR_DST}"
  exit 1
fi

# run rsync
/usr/bin/rsync -a --delete ${DIR_SRC} ${DIR_DST}/BKUP_GEN_${YYYYMMDD_hhmmss}
RC=$?
# return code check and logging
if [ "${RC}" = "0" ] ; then
  /usr/bin/logger "INFO: rsync success ${DIR_SRC} ${DIR_DST}"
else
  /usr/bin/logger "ERROR:rsync ${DIR_SRC} ${DIR_DST} return code: ${RC}"
  exit 1
fi

# generation management
NUM_DST=$(ls -1d ${DIR_DST}/BKUP_GEN_* | sort -r | wc -l)

if [ ${NUM_DST} -gt 0 ] ; then
  if [ ${NUM_DST} -gt ${BKUP_GEN} ] ; then
    NUM_DEL=$(expr ${NUM_DST} - ${BKUP_GEN})
    ls -1d ${DIR_DST}/BKUP_GEN_* | sort -r | tail -n ${NUM_DEL} | xargs rm -rf
    RC=$?
    if [ "${RC}" != "0" ] ; then
      /usr/bin/logger "ERROR:rm command return code: ${RC}"
    fi
  fi
fi


exit 0

【使用方法】
①viでシェルスクリプト作成
 viエディタでファイルを新規作成して、上記「rsyncgen2.sh」の内容を貼り付けます。
 $ vi rsyncgen2.sh
 下記を環境にあわせて編集し、保存します。
 ・DIR_SRC=<バックアップ元ディレクトリ>
 ・DIR_DST=<ユーザ>@<バックアップ先IPアドレス>:<バックアップ先ディレクトリ>
 ・BKUP_GEN=<数字>
②パーミッションを変更
 $ chmod 700 rsyncgen2.sh
③スクリプトを実行して動作確認
 詳細な動作確認をする場合
 「/usr/bin/bash -x rsyncgen.sh」で実行できます。
 スクリプト実行前に、スクリプトを動作確認用に編集すると安全です。
 rsyncはオプションが多数ありますので、必要に応じてスクリプト処理を変更ください。
 通常実行は下記です。
 $ ./rsyncgen2.sh
④CRON登録
 「crontab -l」で確認、「crontab -e」で編集します。編集時の操作方法はviのエディタと同じです。
 「<分> <時> <日> <月> <曜日> <シェルスクリプトのフルパス> > /dev/null 2>&1」
 例)
 45 22 * * * /root/backup/rsyncgen2.sh > /dev/null 2>&1

【注意点】
※rsyncはフルバックアップを使用しています
※バックアップはバックアップ先ディレクトリ配下の「BKUP_GEN_YYYYMMDD_hhmmss」(YYYYMMDD_hhmmssは日時)に格納されます
※loggerコマンドで/var/log/messageにログを出力しています