メインコンテンツまでスキップ

logrotateの処理順の検証

· 約3分

logrotateの設定として、ファイルの圧縮やScriptを実行するオプションがありますが、
どのタイミングで圧縮やローテーション、Scriptが実行されるかを理解せずに書いていたことで、
スクリプトが想定通りに実行されないことがあったため、処理順について検証しました。

検証用設定ファイルの作成

まず、以下のようなlogrotate設定ファイルを作成する。

/root/rotate/test
{
weekly
rotate 2
compress
ifempty
missingok
create
sharedscripts
firstaction
echo "firstaction" > /root/rotate/script_order
ls /root/rotate/test* > /root/rotate/firstaction
endscript
prerotate
echo "prerotate" >> /root/rotate/script_order
ls /root/rotate/test* > /root/rotate/prerotate
endscript
postrotate
echo "postrotate" >> /root/rotate/script_order
ls /root/rotate/test* > /root/rotate/postrotate
endscript
preremove
echo "preremove" >> /root/rotate/script_order
ls /root/rotate/test* > /root/rotate/preremove
endscript
lastaction
echo "firstaction" > /root/rotate/script_order
ls /root/rotate/test* > /root/rotate/lastaction
endscript
}

logrotateの実行

touchなどでローテーション対象のファイルを作成して、1回ローテーションを実行する。
script_orderを確認して処理順を確認したところ、logrotateに設定したScriptは以下の順で事項される

  1. firstaction
  2. prerotate
  3. postrotate
  4. preremove
  5. lastaction

次に、logrotateを実行したときのローテーションなどの処理順を確認するために、
さらに2回ローテーションを実行する。
(rotate 2 のため合計3回のローテーション処理実行をする)

各ファイルの中身は以下のようになった。

  • script_order

    firstaction
    prerotate
    postrotate
    preremove
    preremove
    lastaction
  • firstaction

    test
    test.1.gz
    test.2.gz
  • prerotate

    test
    test.2.gz
    test.3.gz
  • postrotate

    test
    test.1
    test.2.gz
    test.3.gz
  • preremove

    test
    test.1.gz
    test.2.gz
    test.3.gz
  • lastaction

    test
    test.1.gz
    test.2.gz

1回目と違い、preremoveが二回実行されていたが、どうやらファイルを削除する直前に毎回呼び出される模様。
(preremove -> test.1を削除 -> preremove -> test.3.gzを削除)

ローテーション対象ファイルが複数ある場合は以下のように実行された。
(preremove -> test.1を削除 -> preremove -> test.3.gzを削除
-> preremove -> sample.1を削除 -> preremove -> sample.3.gzを削除)

logrotate設定の動作順

したがって、各ファイルの実行結果から、logrotateの実行順序は

  1. firstaction/endscriptの実行
  2. ローテーション済みファイルのローテーション(例:test.1.gz->test.2.gz)
  3. prerotate/endscriptの実行
  4. 対象ファイルのローテーション(例:test->test.1)
  5. postrotate/endscriptの実行
  6. ファイルの圧縮(例:test.1->test.1.gz)
  7. preremove/endscriptの実行※
  8. 圧縮元ファイルの削除(例:test.1の削除)※
  9. preremove/endscriptの実行※
  10. 期限切れファイルの削除(例:test.3.gzの削除)※
  11. lastaction/endscriptの実行

※preremoveはローテーション対象ファイル数回、繰り返し実行される。