为什么 procmail 挂起?

为什么 procmail 挂起?

我有一个愚蠢的 sendmail aliases.local 文件设置用于将电子邮件传递到 procmail。这是一个在古老的 Solaris 系统上运行的设置。现在我在 RHEL6 系统上运行它:

# cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 6.2 (Santiago)

所以我有这个 /etc/mail/aliases.local 文件:

users-log: "|/usr/bin/procmail /auto/data/users/logs/.procmailrc"

/auto/data/users/logs/.procmailrc 看起来像这样:

# cat /auto/data/users/logs/.procmailrc
MAILDIR=/auto/data/users/logs/

:0
responselog

据我了解,procmail 只会将电子邮件写入文件 /auto/data/users/logs/responselog。但由于某种原因,我看到 procmail 进程的数量在增长。

# ps -ef | grep procmail  | wc -l
19
# sleep 2
# ps -ef | grep procmail  | wc -l
23

而且这个数字还在继续增长。如果我执行 strace -p 我会得到以下输出:

# ps -ef | grep procmail 
mail      2872  2861  0 17:05 ?        00:00:00 /etc/smrsh/procmail /auto/data/users/logs/.procmailrc
...
# strace -p 2872
Process 2872 attached - interrupt to quit
fcntl(6, F_SETLKW, {type=F_WRLCK, whence=SEEK_SET, start=1697659298, len=0}

并且该过程就挂在那里。这是怎么回事?我是否错误配置了 procmail?

答案1

感谢杰夫·夏勒。他的评论导致了问题的解决。

响应日志的大小约为 1697659298 字节吗?可能 procmail 正在尝试附加到一个大文件并自行备份。 – 杰夫·夏勒 20 小时前

假设有一个 cron 作业运行来轮换日志文件并缩小其大小。一旦我修复了那个 cronjob,问题就消失了。我还发现 Solaris 系统上的 procmail 是使用不同的文件锁定选项构建的。在 Solaris 上procmail -v显示Locking strategies: dotlocking, fcntl(), lockf()和在 Linux 上procmail -v显示Locking strategies: dotlocking, fcntl()。不确定那是什么意思。如果有人知道请评论。

我找到了这个链接:http://pm-doc.sourceforge.net/doc/#compiling_procmail_and_choosing_locking_scheme

相关内容