Arch Linuxで次のようなエラーが出てうまくいかなかった
error: failed to rename /usr/local/var/log/mirakurun.stderr.log to /usr/local/var/log/mirakurun.stderr.log-20190517: Read-only file system
しかし、普通にsudo logrotate /etc/logrotate.d/mirakurunとか実行するとうまくいく。ちなみに /etc/logrotate.d/mirakurun は次のような感じ
/usr/local/var/log/mirakurun.std*.log
{
su root root
weekly
compress
rotate 52
missingok
notifempty
compresscmd /usr/bin/xz
uncompresscmd /usr/bin/unxz
compressext .xz
dateext
postrotate
pm2 reloadLogs
endscript
}
何気なくlogrotate.serviceを眺めてみたら原因っぽいことが分かった
$ cat /usr/lib/systemd/system/logrotate.service
[Unit]
Description=Rotate log files
Documentation=man:logrotate(8) man:logrotate.conf(5)
RequiresMountsFor=/var/log
ConditionACPower=true
[Service]
Type=oneshot
ExecStart=/usr/sbin/logrotate /etc/logrotate.conf
# performance options
Nice=19
IOSchedulingClass=best-effort
IOSchedulingPriority=7
# hardening options
# details: https://www.freedesktop.org/software/systemd/man/systemd.exec.html
# no ProtectHome for userdir logs
# no PrivateNetwork for mail deliviery
# no ProtectKernelTunables for working SELinux with systemd older than 235
MemoryDenyWriteExecute=true
PrivateDevices=true
PrivateTmp=true
ProtectControlGroups=true
ProtectKernelModules=true
ProtectSystem=full
RestrictRealtime=true
ProtectSystemが怪しい。説明を見てみると、次のようなことが書いてあった。
If true, mounts the
https://www.freedesktop.org/software/systemd/man/systemd.exec.htm/usr
and/boot
directories read-only for processes invoked by this unit.
どうやら/usrがread-onlyになるようだ。ReadWritePaths=/usr/local/var/logでも指定すればいいのだろうか。後ほど試すことにする。
追記:試したがpm2 reloadLogsがコアダンプを起こして終了していた。MemoryDenyWriteExecuteが怪しい気がするが、あきらめる。