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を入れているのであれば、「あえて」入れている場合がほとんどだと思います。
ということで、素直に後者で対応しましょう、という話でした。