2022.02.13  

【Linux】サーバーのファイルをMacに自動バックアップするシェル

Linux,  Mac    

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

コード

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 処理終了
コメント
現在コメントはありません。
コメントする
コメント入力

名前 (※ 必須)

メールアドレス (※ 必須 画面には表示されません)

送信