シェルスクリプトとCronでファイルを自動バックアップ&ローテーション

シェルスクリプトとCronでデータベースを自動バックアップ&ローテーション」に引き続き、今回は、ファイルの自動バックアップ&ローテーションを行うシェルスクリプトを紹介します。

ページ下部のようなシェルスクリプトを文字エンコーディングをEUC-JP、改行コードをLFで作成し、外部からアクセスできない場所に転送します。例ではシェルスクリプトを/virtual/ユーザー名/sh/ディレクトリに作成し、バックアップ先を/virtual/ユーザー名/backup/files/ディレクトリとしています。

あとは、Cronにこのシェルスクリプトを登録し、1日に1回だけ実行されるように設定するだけです。

シェルスクリプトが実行されるたびに、指定したディレクトリにファイルを圧縮したtar.gzファイルが蓄積されていきます。「bk_days」で指定した日数分を超えると、自動的に古いバックアップファイルから削除されていきます。

バックアップはサーバー内に蓄積されていくので、定期的にローカルコンピューターにダウンロードしたり、別のサーバーにサーバー間コピーでバックアップのバックアップを作成するようにしましょう。サーバー自体に問題が発生した場合には、バックアップの意味がなくなってしまいます(経験済み)。

Coreserver以外のサーバーでも、大半のサーバーではディレクトリ名を変えるだけでそのまま使えると思います。

/virtual/ユーザー名/sh/backup_file.sh
#!/bin/sh

# ---------- 設定 ----------
# バックアップ元のディレクトリ
src_dir=/virtual/ユーザー名/public_html/ドメイン名/

# バックアップ先のディレクトリ・ファイル
bk_dir=/virtual/ユーザー名/backup/files/
bk_file=バックアップファイル名

# 保存する日数
bk_days=90

# ---------- ファイル名を設定 ----------
# タイムスタンプを取得
ts_now=`date +%Y%m%d`
ts_old=`date "-d$bk_days days ago" +%Y%m%d`

# ファイル名を設定
file_backup=$bk_file.$ts_now.tar.gz
file_remove=$bk_file.$ts_old.tar.gz

# ---------- バックアップ処理 ----------
# バックアップ元のディレクトリに移動
cd $src_dir
if [ $? != 0 ]; then
echo "Source directory does not exist."
exit 1
fi

# アーカイブを作成
tar cfz $bk_dir$file_backup * .htaccess
if [ $? != 0 -o ! -e $bk_dir$file_backup ]; then
echo "Cannot archive file."
exit 1
fi

# バックアップ先のディレクトリに移動
cd $bk_dir
if [ $? != 0 ]; then
echo "Backup directory does not exist."
exit 1
fi

# ローテーション処理
if [ -e $file_remove ]; then
rm -f $file_remove
fi

exit 0

コメント (6)

はじめまして
シェルスクリプトを勉強しようとこちらにたどりつきました。宜しくお願いいたします。 
ローテーションの処理において、if [ -e $file_remove ];
とありますが、こちらの -e について こちらのいみについてご教示いただけると幸いです。
宜しくお願いいたします。

はじめまして、こんにちは。
[ -e hoge ] で「hogeというファイルが存在したら真」になります。
この場合だと「古いバックアップファイルが存在したら削除する」処理をしています。

[ ] は test コマンドの省略記法なので「test -e hoge」でも同じです。
「man test」すると使えるオプションが確認できるかと思います。

こんにちは。
さっそくのご回答ありがとうございました。
man testで-eについて確認ができました。
ありがとうございました。

初めまして。Tと申します。

tar cfz $bk_dir$file_backup * .htaccess

アーカイブ作成の.htaccessはどういう意味なのでしょうか?
どこかに.htaccessを設定して制御するということでしょうか?

よろしくお願いします。

はじめまして。
バックアップ対象のトップディレクトリに .htaccess ファイルがあった場合、

tar cfz $bk_dir$file_backup *

だと、.htaccess ファイルがバックアップされないので

tar cfz $bk_dir$file_backup * .htaccess

のようにして、単にバックアップに含めるファイル ( .htaccess ) を指定しているだけですね。
他にもトップディレクトリにドットファイルがある場合は、

tar cfz $bk_dir$file_backup * .htaccess .htpasswd

のように個別に指定が必要になります。

早速ご回答いただき、ありがとうございました。

勉強させていただきました。

コメントフォーム

トラックバック (1)

[…]  シェルスクリプトとCronでファイルを自動バックアップ&ローテーション http://dxd8.com/archives/169/ […]

この記事のトラックバックURI
http://dxd8.com/archives/169/trackback/
この記事のURI
http://dxd8.com/archives/169/