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しておけばいい。(それが普通か。)
書いた通りにならないってのはゴミなので、僕は自力でログローテートするようにします。
勉強不足感が否めない。