logrotateでcreate時にパーミッションが効かない
/etc/logrotate.d/
配下でログローテートの設定を行ったときに、ローテートが実行されてもどうしてもパーミッション設定が変わらないことがありました。以下のような設定をしていたときです。
/etc/logrotate.d/sample
/var/log/hoge.log { daily rotate 7 missingok copytruncate create 644 root root }
もともと、対象のログのパーミッションが640
だったものを、ログローテート時に644
にうまく変更してくれることを期待していました。
しかし、実際にはローテートしたとしても、パーミッションは変わりません。640
で作成されたなら、640
のままです。どうしても設定が効かずに、ならなぜcreate
みたいな設定があるのだろうか?と疑問に思いました。
原因は、設定の競合でした。
copytruncate
: ファイル自体を消さずに、中身をコピーして元ファイルの中身を消すcreate
: ファイルが存在しなければ作る
ということで、そもそもcreate
は、ファイルをなければ作るのであって、既に存在するファイルのパーミッションを変更するものではないのでした。一方でcopytruncate
は、ファイルの存在自体を消さないので、いつまでも当初のパーミッションのままファイル自体は存在し続けます。
従って、ログローテート対象のログのパーミッションを変更するには、以下のようにするしかなさそうです。
- logrotateのオプションで
copytruncate
をやめる - そもそもchmodなどでログのパーミッションを変更する
そもそも、ミドルウェアがローテート後のログを見続ける問題があるので、copytruncate
を入れているのであれば、「あえて」入れている場合がほとんどだと思います。
ということで、素直に後者で対応しましょう、という話でした。