ようやく完成!!
・・と言いたいところだったけど、テストをやった後で、
追加したいところが出てきちゃいました。^^;;
明日、最終テストをやれば完成です。
では行ってみましょう。
作成ファイル:
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時間半かかってます。
・・と言いたいところだったけど、テストをやった後で、
追加したいところが出てきちゃいました。^^;;
明日、最終テストをやれば完成です。
では行ってみましょう。
作成ファイル:
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時間半かかってます。