解决Procmail中间歇性的文件locking问题

有没有人看到以下问题与写入到mbox文件时procmail文件locking超时? 对于具有以下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千兆字节),但是问题实例之间的问题是间歇性的,在具有相同procmailrc和GB大小文件的其他用户之间不会发生(尽pipe没有这么大)。

用户不喜欢使用MailDir风格的文件夹,并希望将其保存为mbox文件。 有没有一种方法,我可以重新编写脚本,以允许邮件传递到用户的邮箱,而procmail等待锁的bkp? 我试过了:

 :0c #copy all mail to "Saved" { :0: bkp } 

编辑:我已经改变了上面的食谱:0 w:到:0:因为w等待一个程序,没有在这个声明中执行。

在procmail停止接受电子邮件之前,如果我在testing期间手动lockingbkp,它将允许两个电子邮件。 如果我在postfix超时之前释放锁,邮件将被发送。 我也想确定locking问题的根本原因,但我还没有能够触发它,除非通过自己locking文件。 我已经添加LOCKTIMEOUT = 10来尝试强制在正常的邮件传递没有成功的条件。

这里是procmail的版本信息:

procmail v3.22 2001/09/10 Copyright(c)1990-2001,Stephen R. van den Berg版权所有(c)1997-2001,Philip A. Guenther

通过发送到以下方式,向procmail相关邮件列表提交问题/答案:

当然,这个列表的订阅和信息请求可以:

locking策略:dotlocking,fcntl()默认rcfile:$ HOME / .procmailrc它可能是您的主要组可写的

您是否考虑过使用较小的每日/每周备份邮箱/文件?

您可以使用cron作业将其移动到主备份中。

man procmailex举例说明如何根据date输出获取目的地名称。
man procmail举例说明如何使用formail来后台处理locking邮箱文件。

以下是我所做的:

  • 为了testing我的问题,我构build了一个debian squeeze的vmware映像,并将磁盘IOPS限制为40,内存限制为256MB。

  • 我使用postfix,dovecot和procmail,就像我在生产机器上设置的一样。

  • 我创build了一个用户帐户,并为procmail创build了大量的多GB文件。
  • 我安装了nmon和sysstat,以便在Outlook和本地复制操作正在运行时观察驱动器的磁盘使用情况I / O和tps值。

我发现:

  • 使用postfix获得命令超时相对容易,但我仍然无法生成用户遇到的locking错误(除了使用fcntllocking文件)。
  • 我select了一个4 GB文件作为我的保存档案,然后在Outlook 2011中的该IMAP文件夹上运行“修复文件夹”,同时在服务器上复制一个1.3GB的文件。 这导致服务器磁盘上的足够的I / O在procmail中生成超时。

这并不完全确定,但它看起来像高磁盘负载连同访问procmail试图locking的邮件文件的Outlook客户端可以很容易地延迟邮件传递足够长的时间来命中postfix中设置的命令超时。

我还没有尝试过:

  • 我没有重新编译源代码,并按照procmail源代码中的FAQ 16禁用locking。 在我的情况下,错误是非常罕见的,有定期旋转保存的文件,以保持其小。