Unix全般 -> シェル -> Bash


ログファイルファイルローテーション

概要

ローテーション世代数が2の場合、を超えるファイルは削除する。

cp か mv か


apache のログを例にとって、i-node を表示させる

# ls -li access_log
14140 -rw-r--r--- root root 3829020 Oct 14 access_log

この状態で mvを使って ローテーションしてみる(apacheは起動中)
# mv access_log access_log.1
# cp /dev/null access_log

ローテーション後のログファイルを確認
# ls -li access_log
293821 -rw-r--r--- root root       0 Oct 15 00:01 access_log
14140  -rw-r--r--- root root 3829020 Oct 14 00:01 access_log.1

この状態の場合 apache は i-node番号 14140 でログを認識しているので
access_log.1 にログを出力し続けるのでローテーションしたことにならない。

accees_log の方に出力先を変更するには apacheを再起動させる必要がある。
またはその他のログの場合 HUP シグナルを送らなければならないものもある。

なので、mv よりも cp を使ってローテーションしたほうが良い。
結果は以下のようになり以降も access_log へ出力される。
# cp -p access_log access_log.1  * access_log.1 は新しいi-node番号
# cp /dev/null access_log        * 空にする。
14140  -rw-r--r--- root root       0 Oct 14 00:01 access_log
293821 -rw-r--r--- root root 3829020 Oct 15 00:01 access_log.1

サンプルシェル


#!/bin/sh

# ローテーション世代数を指定
RotationNum=5

# ローテーション対象とするファイルの最小サイズを指定 #
# 無条件でローテーションする場合は NULL #
RotationMinSize=100

# ローテーション対象ファイルをフルパスで指定 #
# 複数指定する場合は改行後に記述する         #
RotationFiles="/var/apache2/logs/access_log
               /var/apache2/logs/error_log"

# ローテーション処理実行 #
for RotationFile in ${RotationFiles}
do
   #
   # ファイルへの書込み権限があるかチェックする #
   if [ ! -w ${RotationFile} ]; then
      continue
   fi

   #
   # ファイルが存在するかチェックする #
   if [ ! -f ${RotationFile} ]; then
      continue
   fi

   #
   # 一定容量以上サイズを超過しているファイルを対象とする場合 #
   if [ -n "${RotationMinSize}" ]; then
      # ファイルが一定容量サイズを超過しているかチェックする #
      if [ -z "`find ${RotationFile} -size +${RotationMinSize}c`" ]; then
         continue
      fi
   fi

   # 古いファイルからローテーションを実施 #
   # ex) File.2 -> File.3                 #
   #     File.1 -> File.2                 #
   CNT=`expr ${RotationNum} - 1`
   while [ ${CNT} -ge 1 ]
   do
      if [ -f ${RotationFile}.${CNT} ]; then
         mv ${RotationFile}.${CNT} ${RotationFile}.`expr ${CNT} + 1`
      fi
      CNT=`expr ${CNT} - 1`
   done

   # File -> File.1  (1世代目のローテーション)                     #
   # 同じアクセス権限及びファイル所有権の保持する為ファイルをコピー #
   # 元のファイルを残しておく                                       #
   #   この場合、元ファイルのiノード番号が変わらないので            #
   #   HUPシグナルを送らなくてもログが切り替わる。                  #
   #   iノード番号を変えたい場合は cp を mv に変更する。            #

   cp -p ${RotationFile} ${RotationFile}.1

   # ファイルの内容を空にする #
   cp /dev/null ${RotationFile}

done

# syslog.conf に記述しているファイルの場合 #
# syslogd に HUP シグナルを送る(solaris)   #
kill -HUP `cat /var/run/syslog.pid`


exit 0



先頭へ

      Document-Folder          一覧
HP-UX
HULFT
JAVA
JP1
JavaScript
Linux
MAC
PHP
Perl
Python
Ruby
SOA
Solaris
Unix全般
Windows
XML
エクセル
スタイルシート
セキュリティー
データベース
ネットワーク
パソコン
ブラウザ
プログラム構文
仮想化
          RSS-Folder
ニュース
   アットマーク・アイティ(@IT)
   シンクイット(ThinkIT)
   インターネットコム
   インターネットウォッチ
   日経IT-Pro
   日経パソコン
   CNET Japan
   ZD-NetJapan
   MYCOM
   RBB-Today
ベンダー
   日本IBM
   日本HP
   サンマイクロシステムズ
   NEC
   富士通
   日立
ソフトウェア
   マイクロソフト
   トレンドマイクロ
   オラクル
   サイボウズ
   Mozilla
   野村総合研究所
   (その他ソフトウェア企業)
更新履歴 一覧
 07/08 PERF
プログラム構文
 07/07 PERF
プログラム構文
 06/25 オブジェクトプログラミング2
Perl>サンプル
 07/12 クローン作成
仮想化>vCenter
 07/12 vyatta設定
ネットワーク>vyatta
 07/12 vyattaインストール
ネットワーク>vyatta
 07/12 リポジトリサーバ
Linux>サーバ構築
 07/05 VMwareのインストール
仮想化>VMware
 07/05 PXEブート
仮想化>KVM
 07/01 DHCPでのPXEブート
仮想化>KVM
 06/27 qcow2仮想DISK作成
仮想化>KVM
 06/13 NWの設定
仮想化>VMwareEsxi
 06/13 IPアドレスの変更
仮想化>VMwareEsxi
 06/12 自動ssh
Unix全般>シェル>Bash
 06/12 diffプログラミング
Python
Google