![修复 Procmail 中的间歇性文件锁定问题](https://linux22.com/image/621928/%E4%BF%AE%E5%A4%8D%20Procmail%20%E4%B8%AD%E7%9A%84%E9%97%B4%E6%AD%87%E6%80%A7%E6%96%87%E4%BB%B6%E9%94%81%E5%AE%9A%E9%97%AE%E9%A2%98.png)
有人在写入 mbox 文件时看到过以下 procmail 文件锁定超时问题吗?对于具有以下 procmailrc 的用户,这种情况每两周就会发生一次:
:0 c: #copy all mail to "bkp"
bkp
大多数情况下,这都没有问题。每隔几周,procmail 日志中就会出现以下消息:
procmail: Forcing lock on "bkp"
procmail: Timeout, was waiting for "bkp"
有时 procmail 能够在 postfix 命令超时(现在设置为一小时)之前释放锁定(或锁定消失)。否则邮件传递会失败,并显示:
relay=local, delay=2001, delays=0.78/0.05/0/2000, dsn=5.3.0,
status=bounced (Command time limit exceeded: "procmail -t -f-")
bkp 文件非常大(超过 10 GB),但问题间歇性出现,在问题发生之间间隔数周,并且对于拥有相同 procmailrc 和 GB 大小文件的其他用户不会发生这种情况(尽管没有一个文件这么大)。
用户不想使用 MailDir 样式的文件夹,而希望将其保留为 mbox 文件。有没有办法可以重写脚本,以便在 procmail 等待 bkp 锁定时允许将邮件传递到用户的邮箱?我试过:
:0c #copy all mail to "Saved"
{
:0:
bkp
}
编辑:我已将上述配方从:0 w:更改为:0:,因为 w 等待一个程序,并且此语句中未执行任何程序。
如果我在测试期间手动锁定 bkp,那么在 procmail 再次停止接受电子邮件之前,它将允许发送两封电子邮件。如果我在 postfix 超时之前释放锁定,邮件将被发送。我还想确定锁定问题的根本原因,但除了自己锁定文件之外,我还无法触发它。我添加了 LOCKTIMEOUT=10 来尝试强制执行条件,但在正常邮件传递中没有成功。
以下是procmail版本信息:
procmail v3.22 2001/09/10 版权所有 (c) 1990-2001,Stephen R. van den Berg 版权所有 (c) 1997-2001,Philip A. Guenther
通过发送以下地址向 procmail 相关邮件列表提交问题/答案:
当然,此列表的订阅和信息请求可以发送至:
锁定策略:dotlocking、fcntl() 默认 rcfile:$HOME/.procmailrc 您的主组可能具有写入权限
答案1
您是否考虑过使用较小的每日/每周备份邮箱/文件?
您可以使用 cron 作业将它们移至主备份。
man procmailex
给出如何根据date
输出获取目标名称的示例。
man procmail
给出如何使用 formail 对邮箱文件进行后期处理的示例带锁定。
答案2
这是我所做的:
为了测试我的问题,我构建了 debian squeeze 的 vmware 映像,并将机器上的磁盘 IOPS 限制为 40,内存限制为 256MB。
我使用 postfix、dovecot 和 procmail 的方式与在生产机器上设置的方式相同。
- 我创建了一个用户帐户并创建了数 GB 的大型文件以供 procmail 写入。
- 我安装了 nmon 和 sysstat 来在 Outlook 和本地复制操作运行时监视驱动器的磁盘使用情况 I/O 和 tps 值。
我的发现:
- 使用 postfix 相对容易获得命令超时,但我仍然无法生成用户遇到的锁定错误(除非使用 fcntl 锁定文件)。
- 我选择了一个 4 GB 的文件作为我的保存存档,然后在 Outlook 2011 中对该 IMAP 文件夹运行“修复文件夹”,同时在服务器上复制一个 1.3GB 的文件。这导致服务器磁盘上有足够的 I/O 来在 procmail 中产生超时。
这还不是完全的结论,但看起来高磁盘负载以及 Outlook 客户端访问 procmail 试图锁定的邮件文件很容易延迟邮件传递,以至于达到 postfix 中设置的命令超时。
我还没尝试过的:
- 我没有按照 procmail 源代码中的 FAQ 16 重新编译源代码并禁用锁定。就我而言,这种错误非常罕见,解决方法是定期轮换保存的文件以使其保持较小。