概要
- サーバの特定の資材を毎日ローカルバックアップ(世代管理)をしていたので、そのシェルスクリプトを備忘録としてまとめます。
- かなり今更感のある技術ですが、温故知新ということで
結論
- 作成したシェルスクリプトは以下になります。
- ディレクトリなどは適宜環境に合わせて修正してください
backup.sh
#!/bin/sh -u
# スクリプトの位置にカレントディレクトリを設定
cd `dirname $0`
# 処理開始時刻を取得
todaydatetime="date '+%Y-%m-%d %H:%M:%S'"
echo "バックアップファイル処理を実行します"
eval $todaydatetime
# 処理時間の計測開始
SECONDS=0
# バックアップ対象
TARGET_DIR='/home/origin'
# バックアップファイルを格納するディレクトリ
backupdirpath="/home/backup"
## ディレクトリの存在チェック
if [ -d ${backupdirpath} ]; then
# バックアップディレクトリが存在している場合、
# 格納されているファイル一覧を表示
ls -lrth ${backupdirpath}
else
echo "バックアップディレクトリがありません。処理を終了します。"
eval $todaydatetime
exit 1
fi
# バックアップファイル名を定義(※ファイル名で日付がわかるようにしておきます)
BACKUP_FILE_NAME=`date +%y%m%d`
# バックアップファイルの作成処理
tar czfp $BACKUP_FILE_NAME.tar.gz $TARGET_DIR
mv $BACKUP_FILE_NAME.tar.gz $BACKUP_DIR
# バックアップファイルをローカルのバックアップフォルダで世代管理
tgtfile="${backupdirpath}/backup_????-??-??.tar.gz"
chkage=$(ls -1 ${tgtfile}|wc -l)
# 保管世代数を設定
age="5"
## tailコマンドで6つ目以降を取り出して削除する処理のため、
## 変数に設定する値は、「保管世代数+1」で指定する
tailage="+6"
# 削除対象ファイルリスト
delfilelist=$(ls -1 -t ${tgtfile}|tail -n ${tailage})
## ファイル削除要否判定
if [[ ${chkage} -gt $age ]]; then
# バックアップファイル数が保管世代数より多い場合、
# 逆順ソートして、最新5世代を残して削除
echo "フォルダに保管されている世代数:${chkage}"
echo "保管世代数${age}を上回っているため、古いファイルを削除します"
echo "削除対象ファイル:${delfilelist}"
echo "古いバックアップを削除します"
rm -f ${delfilelist}
else
echo "不要なバックアップファイルはありません。処理を終了します。"
eval $todaydatetime
exit 1
fi
# 処理終了時刻を取得
echo "バックアップファイル処理を終了します"
eval $todaydatetime
# 処理時間の計測終了
echo "処理実行時間:${SECONDS}秒"
おまけ(日々のバックアップログを作成するシェルスクリプト)
- こうした日々のバックアップログが欲しいと言われたときのメモ
- 楽に見るならJenkinsとかジョブツールを構築するのがいいですが、そこまでのコストかけるほどでもない場合に
- 上記で書いたバックアップシェルを呼び出す親シェルを作成します。
(cronなどで仕込む場合はこちらを呼び出すようにしてください)
top_backup.sh
#!/bin/sh -u
cd `dirname $0`
# バックアップスクリプトを制御する親スクリプト
sh ./backup.sh > logfile_`date "+%Y-%m-%d"`.log 2>&1
# 古いログファイルを削除
tgtfile="./logfile_????-??-??.log"
chkage=$(ls -1 ${tgtfile}|wc -l)
# 保管世代数を設定
age="5"
## tailコマンドで6つ目以降を取り出して削除する処理のため、
## 変数に設定する値は、「保管世代数+1」で指定する
tailage="+6"
# 削除対象ファイルリスト
delfilelist=$(ls -1 -t ${tgtfile}|tail -n ${tailage})
if [[ ${chkage} -gt $age ]]; then
# バックアップファイル数が保管世代数より多い場合、
# 逆順ソートして、最新5世代を残して削除
echo "削除対象ファイル:${delfilelist}"
echo "古いログファイルを削除"
rm -f ${delfilelist}
else
exit 1
fi