修复 Procmail 中的间歇性文件锁定问题

修复 Procmail 中的间歇性文件锁定问题

有人在写入 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 重新编译源代码并禁用锁定。就我而言,这种错误非常罕见,解决方法是定期轮换保存的文件以使其保持较小。

相关内容