shig**のブログ

shignoとshigenが日々をblogするところです。

xianをフルバックアップしよう。(6/4)

2007-10-05 01:21:29 | 1W180M
ようやく完成!!
・・と言いたいところだったけど、テストをやった後で、
追加したいところが出てきちゃいました。^^;;

明日、最終テストをやれば完成です。
では行ってみましょう。

作成ファイル:
bk_cire.func :各種共通関数を格納。ほぼ完成なのですが、最後に調整を入れちゃいました。
bk_main.sh :バックアップスクリプト本体。こっちもほぼ完成の状態。
xianbk.sh :バックアップ実行のフロントエンド。こいつを実行することで処理を開始します。

xian.bk


#!/bin/bash

##############################
### xian backup script ###
### boot script. ###
##############################
          ← なんかscriptって2回書いてるけど;;
##### boot xian_bk script on background. #####
# messege.
cat << EOF          ← ここでのフロントエンドとはユーザーが触ることになるファイル。
          ← 具体的にはこいつを実行することで処理が開始されます。
==========================================================
xian backup script を開始します。suで実行してますよね?
処理はバックグラウンドで行われます。
終了通知はメールにて行いますので、しばらくお待ちください。

!!注意!!
ファイル名に半角スペースを含むファイルは正常にバックアップ
できません!
詳細はログファイルを参照してください。
==========================================================
EOF          ← 起動時のメッセージ。全ファイルをバックアップしているのでroot権限で実行することが必須です。

# boot backup.
./bk_main.sh &          ← bk_main.shを呼び出します。後ろに&を付けるとバックグラウンドで実行されます。



bk_core.func


#!/bin/bash

##############################

### xian backup script ###

##############################

##### startup #####
# import function file.
. ./bk_core.func

# initialize.
initproc shigen

# mount HDD.
mtbkhd "/dev/sda1"

writelog "バックアップ処理の準備が整いました。バックアップを開始します。"



##### backup files. #####
xianbkfs


##### ummount and exit. #####
exitproc バックアップ終了          ← 終了メッセージをデバッグ用から本番用に変えました。このファイルの変更点はこれだけw




bk_main.sh


##############################
### xian backup script ###
### core functions. ###
##############################

###### initialize ######
initproc(){
# DO NOT FORGET!!          ← 使い方が少し変わりました。
# useage: initproc (send mail adress)          ← 使い方は、initproc (通知メールの送信アドレス)

# set default settings.
ourdir="./"
logfile=${outdir}xianbk.log
userm=$1

writelog "xian backup scriptを初期化しました。通知は ${userm} 宛に行われます。"

# send mail.          ← 処理開始時にメールを送るようにして、PIDを件名に追加しました。
mail -s "バックアップ開始[$$] - xian backup script" ${userm} << EOF
xian backup scriptを開始します。終了通知はこのアドレス宛に行われます。
終了までしばらくお待ちください。

xianの現在のファイル使用量は以下の通りです。

`df`

!!注意!!
ファイル名に半角スペースを含んでいるファイルは正常にバックアップできません!
詳細はログファイルを参照してください。
EOF

writelog "処理開始メールを ${userm} 宛に送信しました。" "処理開始メールを ${userm} 宛に送信できませんでした。"
}


##### mount HDD. #####
mtbkhd(){          ← バックアップHDDをマウントします。
# usage: mtbkhd (hdd device path)          ← 使い方は、mtbkhd (マウントするHDDデバイスのパス)。
hdpath="/media/usbhd"
mount -t vfat $1 $hdpath

writelog "バックアップHDD( $1 )を $hdpath にマウントしました。" "バックアップHDD( $1 )のマウントに失敗しました。"

setoutdir "${hdpath}/xian_bk/`date +%Y%m%d"_"%H%M%S`/"
}


##### unmout HDD.#####
umtbkhd(){          ← 上でマウントしたHDDをアンマウントします。
# useage: umtbkhd [none]          ← 使い方は、umtbkhd 引数は必要ありません。
writelog "$hdpath をアンマウントします。"
umount $hdpath          ← これをしないことにはバックアップHDDを取り外せません。
}


##### set output logfile name. #####
setlogf(){
# useage: setlogf (logfile name)

logfile=$1
writelog "ログの出力先を ${logfile} に設定します。" "ログ出力先の設定に失敗しました。"

}


##### set output dir. #####
setoutdir(){
# usage: setoutdir (output dir)

# check dir.
if [ -d $1 ]
then
outdir=$1
else
mkdir $1
writelog "$1 が存在しなかったため、新規に作成しました。" "$1 の作成に失敗しました。"
outdir=$1
fi

# output log.
test -d $outdir
writelog "ファイルの出力フォルダを ${outdir} に設定しました。" "ファイルの出力フォルダを ${outdir} に変更できませんでした。"

# change log file.
if [ -f $logfile ]
then
writelog "出力フォルダが変更されたため、ログファイルを ${outdir}xianbk.log に移動します。"
cat $logfile >> ${outdir}xianbk.log
if [ $?=0 ]
then
oldlogfile=$logfile
setlogf ${outdir}xianbk.log
else
:
fi
rm $oldlogfile
writelog "移動元のログファイル $oldlogfile を削除しました。" "移動元のログファイル $oldlogfile の削除に失敗しました。"
else
setlogf ${outdir}xianbk.log
fi
}


##### output log file. #####
writelog(){
# useage: writelog (true_msg) (false_msg)

# catch error No.
errno=$?

# get nowtime , PID
logheader=`date +%D" "%T" "`xian_bk_script[$$]:

# output log.
if [ $errno = "0" ]
then
log_mes="$1 ($errno)"
elif [ $2 ]
then
log_mes="$2 ($errno)"
else
log_mes="【ERROR】 $1 ($errno)"
fi

echo $logheader $log_mes >> $logfile

# check, output log.
if [ $? = "0" ]
then
:
else
echo "ログが書き込めません! writting: "$logheader $log_mes
exit $?          ← ログの書き込みに失敗した場合、強制終了してなかったので(!)慌てて追加。;;
fi

# if error, exit script.
if [ $errno = "0" ]
then
:
else
exitproc "エラーが発生した為、強制終了します。" $errno
fi

}


##### exit processing. ######
exitproc(){
# useage: exitproc [message] [exitno]
          ← 引数を減らしました。終了通知メールはinitprocで指定したアドレス宛に送信されます。
# get last status.
if [ $# = 2 ]
then
lastst=$2
else
lastst=0
fi

# output log.
writelog $1

# send mail.          ← 終了通知メールの件名にPIDを追加しました。ついでに文言を少し変更。
mail -s "$1 [$$] - xian backup script" ${userm} << EOF
xian backup scriptの処理が終了しました。終了ステータスは $lastst です。
xianの現在のファイル使用量は以下の通りです。

`df`

実行ログを以下に添付します。
-----From logfile.-----
`cat $logfile`
EOF

writelog "バックアップ終了通知メールを送信しました。" "バックアップ終了通知メールの送信に失敗しました。"

# umount HDD.
umtbkhd

# exit.
exit $lastst
}



##### backup files. #####
xianbkfs(){

## root dir.
writelog "ルートのみをバックアップします。"
# list dir.
ls / -1 > "${outdir}/rootdir.list"

# backup.
while read fline
do
case $fline in
home);;
media);;          ← バックアップから除外するフォルダを追加しました。
mnt);;          ← こいつを付けなかったばっかりに無限ループの暴走を起こしたのは内緒w
*)
writelog "/$fline をバックアップします。以下はtarのログです。=="
tar -cpzf "${outdir}${fline}.tar.gz" "/${fline}" ${dir}${LINE} >> $logfile 2>&1
#writelog "==ここまで。 /$fline をバックアップしました。"
;;
esac
done < "${outdir}/rootdir.list"


## home dir.
writelog "/home/以下をバックアップします。"
# list dir.
ls /home/ -1 > "${outdir}/homedir.list"

# create home dir.
mkdir "${outdir}/home/"

# backup.
while read fline
do
case $fline in
*)          ← ログファイルに書き出す文言を少し変更。
writelog "/home/$fline をバックアップします。以下はtarのログです。=="
tar -cpzf "${outdir}/home/${fline}.tar.gz" "/home/${fline}" ${dir}${LINE} >> $logfile 2>&1
#writelog "==ここまで。 /home/$fline をバックアップしました。"
;;
esac
done < "${outdir}/homedir.list"

}





【メモ】
・バックアップ時の注意
コピーだとファイル属性と作成ユーザー名が変更される。圧縮ファイルに。
ただし、大きさのコントロールをしないと、DVD-Rに移せない可能性が・・
→圧縮ファイルにはできたけど、容量のコントロールは未解決。どうしたものか。。

・半角スペースを持つファイルの扱い
tarでエラーになる。こいつが解決しないと、tarのエラーチェックができない。

・暴走時の停止方法の検討
gzipの無限ループによって暴走した際、一発で止める方法がないことが判明。
現在の所、都度gzipプロセスを止めなくてはならない。

【TODO】
・最終テスト
これで終わり!!


今日はここまで。
明日、最終テストがてら第1回目のバックアップを取ります。
ちなみに、今日のテストでは完了まで2時間半かかってます。

最新の画像もっと見る