CentOSでlogrotateのcreateが機能しない

CentOS6でrsyslogで出力されたファイルの権限が0600なので、それを別のユーザから読めるようにしたくて、logrotate時にcreate 0644を与えたが、機能しなかった話。

以下再現コード。logrotateのversionは3.7.8でした。

mkdir -p /var/logrotate-test/logrotate.d

cat << _EOF_ > /var/logrotate-test/logrotate.conf
daily
rotate 4
#create
dateext
include /var/logrotate-test/logrotate.d
_EOF_

cat << _EOF_ > /var/logrotate-test/logrotate.d/a.conf
/var/logrotate-test/a.log
{
    create 0644
}
_EOF_

echo > /var/logrotate-test/a.log
chmod 600 /var/logrotate-test/a.log

logrotate -vf /var/logrotate-test/logrotate.conf
ls -l /var/logrotate-test | grep a.log

# clean-up
rm -rf /var/logrotate-test

ubuntuだとlsコマンドで期待通りの結果が得られる。(644になる)

CentOSだとなぜか元の権限のままになる。(600になる)

strace logrotateしてみても(微妙に挙動が違えど)ちゃんとfchmod(3/*FD*/, 0644)呼び出してるんだよなぁ。

open("/var/logrotate-test/logrotate_temp.qS8NzA", O_RDWR|O_CREAT|O_EXCL, 0600) = 3
umask(022)                              = 0
fchown(3, 0, 0)                         = 0
fchmod(3, 0644)                         = 0
rename("/var/logrotate-test/logrotate_temp.qS8NzA", "/var/logrotate-test/a.log") = 0
fsetxattr(3, "system.posix_acl_access", "\x02\x00\x00\x00\x01\x00\x06\x00\xff\xff\xff\xff\x04\x00\x00\x00\xff\xff\xff\xff \x00\x00\x00\xff\xff\xff\xff", 28, 0) = 0
close(3)                                = 0

こういうのが悩ましいなぁ。
こうやっておけば出来るだろって思い込みが崩れると何もかもチェックチェックチェックになって面倒になる。いややるべきだけど。

この対応としては、元の権限は保持されるので、logrotateの設定に関わらず、あらかじめ対象のファイルをchmodしておけばいい。(それが普通か。)

書いた通りにならないってのはゴミなので、僕は自力でログローテートするようにします。

勉強不足感が否めない。