我想对我的 mail.log(Ubuntu 20.04 LTS 上的 postfix 3.2.13)运行一些分析,包括更新无法投递的电子邮件数据库,所以我编写了脚本,从通用 /var/log logrotate 脚本中排除了 mail.log 并创建了一个新的 /etc/lorotate.d/mail_log 在 post-rotate 部分运行脚本。虽然脚本被调用,但它无法生成 db 文件:
postfix/postmap[540039]: fatal: open /etc/postfix/bad_recipients.db: Read-only file system
考虑到这实际上可能是权限问题,我为 syslog 用户添加了 sudoers 规则(/var/log/mail 文件归 syslog 用户所有)并修改了 logrotate 脚本:
/var/log/mail.log
{
rotate 30
daily
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
sudo /usr/local/sbin/mailfail.sh
endscript
}
但是我仍然在每个 mail.log ( ) 的顶部报告相同的错误,Read-only file system
并且数据库没有更新。
脚本正在执行表明它不是脚本上的 chroot 或权限或 sudo 错误配置问题。正在写入的其他文件具有 syslog 用户(拥有日志文件的用户)的权限。
Rsyslogd 似乎是链中唯一受 apparmor 配置文件约束的可执行文件 - 但将路径 /etc/postfix* (rwk) 添加到配置文件并从强制切换到抱怨对错误没有影响。
(从命令运行脚本按预期工作)
这可能是由 systemd 的保护功能引起的,这些功能为
logrotate
Postfix 启用。特别是ProtectSystem
,如果设置为“full”或“strict”,将导致/etc
只读。您应该将任何您希望能够修改的内容移动到
var
,或者如果您无法避免更改/etc
,请覆盖相关单位 (systemctl edit
) 以更改ProtectSystem
为“true”,这将保护/usr
但不会/etc
。