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は以下の順で事項される
- firstaction
- prerotate
- postrotate
- preremove
- 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の実行順序は
- firstaction/endscriptの実行
- ローテーション済みファイルのローテーション(例:test.1.gz->test.2.gz)
- prerotate/endscriptの実行
- 対象ファイルのローテーション(例:test->test.1)
- postrotate/endscriptの実行
- ファイルの圧縮(例:test.1->test.1.gz)
- preremove/endscriptの実行※
- 圧縮元ファイルの削除(例:test.1の削除)※
- preremove/endscriptの実行※
- 期限切れファイルの削除(例:test.3.gz の削除)※
- lastaction/endscriptの実行
※preremoveはローテーション対象ファイル数回、繰り返し実行される。