自動バックアップの構築

以前報告した Linux パソコンについて、最近やっと自動バックアップ処理が安定してきました。


最初は Deja Dup を使用してバックアップ処理を構築しようとしていたのですが、ディレクトリごとに時間を分けてバックアップする方法が分からなかったので、crontab と rsync を使用し、月一回の完全バックアップと週一回の差分バックアップを実行するようにしました。

crontab の設定は以下の通りです。

完全バックアップ
0 1 2 * * rsync -az --delete --checksum --ignore-errors /home/samba/ /backup/base/samba/

差分バックアップ
0 13 * * Tue rsync -a --link-dest=/backup/base/samba/Data/ /home/samba/ /backup/diff/$(date +\%Y-\%m-\%d)

差分バックアップは、バックアップを作成した日付のフォルダを作成し、その中に保存するようにしています。
シェル スクリプトでは、date +%Y-%m-%d で日付を表示できるのですが、ctontab に記載する場合は % の前に \ が必要なことに気づかず、しばらく悩みました。

上の処理だけだと、差分バックアップを実行するたびにディレクトリが増えます。
そこで、下記のシェル スクリプトを crontab に登録し、ディレクトリ数が指定よりも増えた場合、自動的に削除するようにしています。

#!/bin/bash

TARGET_PATH=/backup/diff

# $TARGET_PATH 内のフォルダ数を確認する
NUMBER_OF_FILE=$(ls -1 "$TARGET_PATH" | wc -l)

# フォルダ数が4より多い場合、古いフォルダを削除する
if [ $NUMBER_OF_FILE -gt 4 ]
then
  COUNT_OF_LOOP=$((NUMBER_OF_FILE-4))
  i=1
  for filePath in $(ls "$TARGET_PATH")
  do
    filePath=$TARGET_PATH"/"$filePath
    $(rm -fr $filePath)
    i=$((i + 1))
    if [ $i -gt $COUNT_OF_LOOP ]
    then
      break
    fi
  done
fi

できれば、break を使用せず、for の条件式でループ回数とフォルダ名を制限したかったのですが、いい処理を考えることができませんでした。

将来の自分がもっといい処理を思いつくことを期待し、現在の処理を公開します。

コメントを残す