Linuxサーバー(AWS:EC2:centos7)にあるファイル(zip)を定期的にローカル(Mac)へバックアップするシェルスクリプトを作成しました。
シェルスクリプトの定期実行にはcronを使用します。
また、バックアップ対象のzipファイルはcentos側で自動生成しています。
仕様
・サーバーにscp接続し、ファイルを取得する。
・取得したファイルの末尾に、ダンロード取得日が付与される。
・KEEP_BACKUP_DAYで指定した日付より古いダウンロードファイルを削除する。
※KEEP_BACKUP_DAYを5に設定したら本日から5日以上過ぎたファイルが対象
・実行結果をログ出力する
使い方
シェルスクリプト(backup.sh)の設定欄で以下を指定する。
・対象サーバーのIPアドレス
・対象サーバーへのログインユーザー
・対象サーバーにあるDL対象のファイル名
・DL対象ファイルまでの絶対パス
・ローカル端末のDLファイル配置先パス
・ローカル端末にある接続サーバーの秘密鍵
・ローカル端末に出力するログ名と出力先(任意)
・バックアップファイルの保存期間(デフォルトでは5日)
上記を指定したらMacに配置する。
backup.shに権限をつける。
$ chmod 755 backup.sh
Macでbackup.shを実行する。
$ ./backup.sh
定期実行したい場合はcrontab -e
で次のように設定する。
下記例は、毎日午後12時にbackup.shを実行する設定です。
※ Macが起動状態でないときは実行されない
$ crontab -e
0 12 * * * bash /Users/user/admin_app/backup.sh
コード
#!/bin/bash
#----------------------------------------------
# 各種設定
#----------------------------------------------
# 対象サーバー
TARGET_IP="44.55.222.111"
# 対象サーバーへのログインユーザー
TARGET_USRE="centos"
# 対象サーバーにあるDL対象のファイル名
TARGET_FILE="BK_APP.zip"
# DL対象ファイルまでの絶対パス
TARGET_PATH="/home/centos"
# ローカル端末のDLファイル配置先パス
DL_PATH="/Users/user/admin_app/backup_app"
# ローカルにある接続サーバーの秘密鍵を指定する
LOGIN_KEY="/Users/user/.ssh/rurukblog.pem"
# ログ出力先とログ名を設定する。
LOG_PATH=$DL_PATH
LOG_NAME="$(basename $0 | sed -e 's/.sh//g').log"
# バックアップファイルの保存期間
KEEP_BACKUP_DAY=5
#----------------------------------------------
# 定数
#----------------------------------------------
NOW_DATE=$(date '+%Y%m%d')
#----------------------------------------------
# ログ関数
#----------------------------------------------
function log () {
# ログ出力先とログ名を関数に設定。
LOG=$LOG_PATH/$LOG_NAME
# ログ出力日時のフォーマットを yyyy/mm/dd hh:mm:ss に設定する
time=$(date '+%Y/%m/%d %T')
# 最初の引数の文字列をログ出力する
# 画面表示不要の場合 tee -a を >> に書き換え)
echo -e "$time" "$1" | tee -a $LOG
}
#----------------------------------------------
# Main
#----------------------------------------------
log "処理開始"
# 作業ディレクトリへ移動
cd $DL_PATH
log "${KEEP_BACKUP_DAY}日より前のバックアップファイルがあれば削除"
target_bkfile=$(find ${DL_PATH} -type f -mtime +${KEEP_BACKUP_DAY} | grep ${TARGET_FILE})
if [[ -n $target_bkfile ]]; then
log "バックアップファイルの削除:\n${target_bkfile}"
echo $target_bkfile | xargs rm -f
else
log "削除対象なし"
fi
log "${TARGET_FILE} のダウンロードを開始します"
result=$(scp -i ${LOGIN_KEY} ${TARGET_USRE}@${TARGET_IP}:${TARGET_PATH}/${TARGET_FILE} ${DL_PATH})
if [[ $(echo $?) -ne 0 ]]; then
log "ダウンロード失敗 ${result}"
exit 1
fi
log "ダウンロードに成功しました: ${TARGET_FILE}"
log "ダウンロードファイルをリネームします"
mv "${TARGET_FILE}" "${TARGET_FILE}_${NOW_DATE}"
log "リネームしました。: ${TARGET_FILE}_${NOW_DATE}"
log "処理終了"
exit 0
実行結果
$ ./backup.sh
2022/02/13 12:15:33 処理開始
2022/02/13 12:15:33 5日より前のバックアップファイルがあれば削除
2022/02/13 12:15:33 削除対象なし
2022/02/13 12:15:33 BK_APP.zip のダウンロードを開始します
2022/02/13 12:28:50 ダウンロードに成功しました: BK_APP.zip
2022/02/13 12:28:50 ダウンロードファイルをリネームします
2022/02/13 12:28:50 リネームしました。: BK_APP.zip_20220213
2022/02/13 12:28:50 処理終了