【スクリプト機能】
①指定したログをバックアップ先へバックアップ
②バックアップ先のログのメンテナンス
③バックアップ対象ログの初期化or削除or何もしない
細かい仕様
・バックアップ対象はファイルのみ(ディレクトリは不可)
・バックアップ対象の指定にワイルドカードを使用可
・バックアップ先のログメンテは保存日数で管理(世代数ではない)
・ログファイルごとに保存日数の設定可
・バックアップ先のログは全てgzipで圧縮する
・bashのみ?対応(bash以外で使用できない書式、コマンドオプションあり)
・途中でエラーがあっても全てのログを処理しきる
・ログ出力はエラーのみ
【リストファイル】
ファイル名:logbkup.lst
書式:bkupするログ,bkup先ディレクトリ(最後に/必須),保存期間(日),ログクリア(null,rm,N)
1 2 |
/var/log/secure*,/log/bkup/os/,7,N /var/log/appl/E201?????,/log/bkup/appl/,7,null |
※バックアップ先はバックアップ元と同じ場所にしないほうがよい。同じにするとワイルドカードでバックアップ対象を指定した際に、ファイル名の後ろに日付のついたバックアップファイルを対象として誤検知してしまう場合がある。バックアップ先は違うディレクトリにしたほうが無難。止むを得ず同じディレクトリにする場合は、対象ログの指定の仕方に注意すること。
【サンプルコード】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
#!/bin/bash ############################################################# # シェル名 : logbkup.sh # 機能 : ・ログのバックアップ # ・バックアップファイルのローテート # ・ログのnullクリア or 削除 # 引数 : なし # リスト : /home/user/shell/etc/logbkup.lst # 履歴 : 2017/07/09 初版作成 # ############################################################# ### 変数定義 ########################### LIST_FILE="/home/user/shell/etc/logbkup.lst" LOG_OUTPUT="/home/user/shell/log/$0.log" YESTERDAY=`date --date '1 day ago' +%Y%m%d` ←環境によって--dateオプションがない場合あり RC=0 ### 内部関数 ########################### #開始ログ出力関数 Log_Start() { echo "##########################################" >> ${LOG_OUTPUT} echo `date '+%Y/%m/%d %H:%M:%S'` >> ${LOG_OUTPUT} echo >> ${LOG_OUTPUT} } #終了ログ出力関数 Log_Stop() { echo "戻り値=${RC}" >> ${LOG_OUTPUT} echo `date '+%Y/%m/%d %H:%M:%S'` >> ${LOG_OUTPUT} } ### メイン処理 ######################### #開始ログ出力 Log_Start #リストファイルの有無確認 if [ ! -f ${LIST_FILE} ]; then echo "リストファイルが存在しません" >> ${LOG_OUTPUT} RC=1 Log_Stop exit ${RC} fi while IFS=, read BKUP_FROM BKUP_TO DAYS CLEAR do #バックアップ元ファイルの存在確認 find ${BKUP_FROM} -maxdepth 1 -type f > /dev/null 2>&1 if [ ! $? -eq 0 ]; then echo "ERROR: バックアップ元ファイル(${BKUP_FROM})が存在しません" >> ${LOG_OUTPUT} RC=1 continue fi #バックアップ先ディレクトリの存在確認 if [ ! -d ${BKUP_TO} ]; then echo "ERROR: ${BKUP_FROM}のバックアップ先(${BKUP_TO})が存在しません" >> ${LOG_OUTPUT} RC=1 continue fi while read FILE_FULLPATH do FILE_NAME=`basename ${FILE_FULLPATH}` #ログのバックアップ実行 cp -p ${FILE_FULLPATH} ${BKUP_TO}${FILE_NAME}_${YESTERDAY} > /dev/null 2>&1 if [ ! $? -eq 0 ]; then echo "ERROR: ファイルのコピーに失敗しました(cp -p ${FILE_FULLPATH} ${BKUP_TO}${FILE_NAME}_${YESTERDAY})" >> ${LOG_OUTPUT} RC=1 continue fi #バックアップファイルの圧縮 gzip ${BKUP_TO}${FILE_NAME}_${YESTERDAY} if [ ! $? -eq 0 ]; then echo "ERROR: ファイルの圧縮に失敗しました(gzip ${BKUP_TO}${FILE_NAME}_${YESTERDAY})" >> ${LOG_OUTPUT} RC=1 continue fi #バックアップファイルのローテート NUM=`expr ${DAYS} - 1` find ${BKUP_TO}${FILE_NAME}_* -mtime +${NUM} | xargs rm -f > /dev/null 2>&1 if [ ! $? -eq 0 ]; then echo "ERROR: バックアップファイルのローテートに失敗しました(find ${BKUP_TO}${FILE_NAME}_* -mtime +${NUM} | xargs rm)" >> ${LOG_OUTPUT} RC=1 continue fi #バックアップ元ファイルのnullクリアor削除 case ${CLEAR} in "null" ) cat /dev/null > ${FILE_FULLPATH} if [ ! $? -eq 0 ]; then echo "ERROR: ヌルクリアに失敗しました(cat /dev/null > ${FILE_FULLPATH})" >> ${LOG_OUTPUT} RC=1 continue fi ;; "rm" ) rm -f ${FILE_FULLPATH} if [ ! $? -eq 0 ]; then echo "ERROR: ファイル削除に失敗しました(rm -f ${FILE_FULLPATH})" >> ${LOG_OUTPUT} RC=1 continue fi ;; "*" ) continue ;; esac done < <(find ${BKUP_FROM} -maxdepth 1 -type f) ←bashじゃないとこのやり方はできない done < ${LIST_FILE} #終了ログ出力 if [ ${RC} -eq 0 ]; then Log_Stop exit ${RC} else echo "異常終了しました RC=${RC}" >> ${LOG_OUTPUT} Log_Stop exit ${RC} fi |
コメント