【Shell】ログバックアップを考える & 簡易スクリプトの作成

 ■ はじめに

Apache や Tomcat 等でログが出力されるが、
そのまま放置したら大量なログが出てしまう可能性がある。

その一つの解決策として、定期的に圧縮してバックアップを取る
といった事を考えられるので、その方法を調べ、簡易的なものを作ってみる

 ■ 解決案

# 他にもあるかもしれないが... 
 * 独自でログバックアップ用のスクリプトを組み、
   そのスクリプトを定期的に実行する

■ 考慮する事項

以下、考慮しなければならない事項である

 1)バックアップ出力先は?

 * そのシステムのポリシーもあると思うので一概に言えないし、一般的にどこにおくか分からんが...

Debianの場合

 * 「/var/backups」ってあったので、その配下でいいのでは?
 * 「/var/log」配下に「backups」ってディレクトリを作って...てのもあり?

【補足】

 * var : システムログなどの動的に変化するファイル

http://www.atmarkit.co.jp/ait/articles/0109/07/news002_2.html
http://www.linuxmaster.jp/linux_skill/2010/02/06linux.html

2)スクリプトを定期的に実行する方法は?

 * スクリプトを組む前に「スクリプトを定期的に実行する」を考える

 方法1-1 : cron に登録して、定期実行させる

 * cron(クローン) とは、スクリプトを自動実行するためのデーモン
 * 登録方法は、「crontabコマンドを使う」「Webmin(ウェブミン)などのアプリを使う」
 とありそうだが、ここでは扱わない

 方法1-2 : 無限ループ & sleepコマンド を使う

 => バックアップ用のスクリプトに1ファイルとして組み込めるので、
    簡易なツールとしては、まーいいのでは?

構文

while true
do
  # 【実行する処理コマンド】
  sleep 【周期(例 : 24h)done

 方法1-3 : watchコマンドを使う

* watchコマンド : 定期的にコマンドを実行する 
 => 簡易版として、個人的には方法2より、
   「定期実行」「バックアップ」と分離できるこちらの方法の方がいいと思う。
 => 監視にも使えるらしい...
 => 詳細は、以下の関連記事を参照のこと

watchコマンド
https://dk521123.hatenablog.com/entry/2024/03/24/232633

 3)バックアップ用スクリプトについて

 方法2-1 : rsyncコマンドを使用する

* rsyncコマンド : 高速なファイル同期を行うコマンド 
 => 新旧ファイル間の差分をコピーするので、高速に処理でき、バックアップとしても使える
 => バックアップした後、元ファイルを削除するっていったときには、向かない?

http://www.itmedia.co.jp/enterprise/articles/0804/21/news013.html
https://users.miraclelinux.com/update/?q=node/172

 方法2-2 : tar / zipで固める

 => まー分かりやすいので、簡易的なものであれば、十分かなっと。
 => Linuxだけを考えれば、zipは環境によってZIPコマンドがインストールされていない可能性があるので
    tarで圧縮した方がいいかも。

 ■ サンプル

 * Tomcatログを対象に、上記の「方法1-3」&「方法2-2」を採用して、
   サンプルスクリプトを組んでみる

 バックアップ用スクリプト : BackupTomcatLogs.sh

#!/bin/bash

# Setting Value
# 実行間隔
execution_interval=24h
tomcat_home="/usr/tomcat"
target_logs_dir="${tomcat_home}/logs"
output_backup_dir="/var/backups/tomcat"

echo "******************************"
echo "* execution_interval: ${execution_interval}"
echo "* tomcat_home       : ${tomcat_home}"
echo "* target_logs_dir   : ${target_logs_dir}"
echo "* output_backup_dir : ${output_backup_dir}"
echo "******************************"

# 出力先のディレクトリを作成しとく
#  -p : 指定したディレクトリをサブディレクトリごと作成する
mkdir -p ${output_backup_dir}
chmod 777 ${output_backup_dir}

while true
do
  # 必ず「`(バッククォート。@キー+Shiftキーで入力)」で囲む
  start_datetime=`date "+%Y%m%d_%H%M%S"`
  echo "Starting Backup Tomcat Log. ${start_datetime}"

  if [ -z "`ls ${target_logs_dir}`" ]; then
    # fileが存在しなかった場合
    echo "No file for backup."
  else 
    # fileが存在した場合
    output_backup_zip="${output_backup_dir}/tomcatlog_${start_datetime}.zip"
    # ZIP圧縮(http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231001/ より抜粋)
    #  -r : ファイルとディレクトリを再帰的に処理する
    #  -q : 処理内容を表示しない
    #  -j : ファイルのパスを記録せず,対象に含まれていてもディレクトリは格納しない
    echo "Creat ZIP file. ${output_backup_zip}"
    zip -rqj ${output_backup_zip} ${target_logs_dir}
    chmod 777 ${output_backup_zip}

     # 今日のログ以外削除
    today=`date "+%Y-%m-%d"`
    echo "Cleanup except files of ${today}."
    ls -dF ${target_logs_dir}/* | grep -v -E '*${today}.log$|catalina.out' | xargs rm -rf
  fi

  end_datetime=`date "+%Y%m%d_%H%M%S"`
  echo "Done. ${end_datetime}"

  sleep ${execution_interval}
done

 参考文献

ディレクトリのファイルの有無をしらべる
http://kuchitama.hateblo.jp/entry/20111226/p1

関連記事

watchコマンド
https://dk521123.hatenablog.com/entry/2024/03/24/232633