在 cygwin 下运行的 exim 出现“资源暂时不可用”错误

在 cygwin 下运行的 exim 出现“资源暂时不可用”错误

我最近在 Windows Server 2008 R2 中设置了exim版本 4.86.1 作为Cygwin服务运行。如果我一次发送一封电子邮件,它工作正常。但是,如果我尝试使用脚本发送 10 封电子邮件,每封都紧接着另一封,那么可能只有一两封电子邮件可以正常工作。在电子邮件之间添加 5 秒的暂停也可以。

在该exim_panic.log文件中,每次失败都是由于以下类型的错误引起的:

2016-06-07 04:09:00 O8DPZ0-000708-7G Cannot lock /var/spool/exim/input/0/O8DPZ0-000708-7G-D (11): Resource temporarily unavailable

同时,/var/spool/exim/input目录中包含一堆大小为零的文件,其名称与上述错误消息中的名称相匹配(即O8DPZ0-000708-7G-D)。这些邮件不在队列中,因为exim -bpc返回零,并且 exim 不会重试发送电子邮件。

答案1

Resource temporarily unavailable错误通常意味着您已达到系统或进程资源限制,例如可用内存、允许的用户进程数、用户可同时打开的文件数。启动新进程、打开新文件或当前正在运行的进程向内核请求更多内存时,可能会出现此错误。

其中一些限制是用户限制,可以使用ulimit命令设置。运行该ulimit -a命令将显示当前设置的用户限制,例如,

$ ulimit -a

core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
open files                      (-n) 256
pipe size            (512 bytes, -p) 8
stack size              (kbytes, -s) 2036
cpu time               (seconds, -t) unlimited
max user processes              (-u) 256
virtual memory          (kbytes, -v) unlimited

从错误消息来看,您的问题可能是由于文件描述符不足造成的。可能需要通过运行以下命令检查打开了哪些文件描述符

ls -l /proc/<PID>/fd

Cygwin 特定

类似的问题也可能由以下原因引起:不可靠应用程序大名单(通过将自身注入系统调用链来干扰 Cygwin 正常工作的应用程序列表)。

我从未使用过 Exim,所以我不知道它是否会在运行时分叉许多子进程,但 Fork 失败也可能是一个问题;它们记录在 Cygwin FAQ 中:我该如何修复fork()失败?。有时安装的库没有正确更新,必须使用 Cygwinsetup.exe或运行进行更新rebaseall。请参阅

Resource temporarily unavailable最后,当我运行 32 位 Cygwin 时,我曾经收到很多消息。升级到 64 位后,这些消息大多消失了。

相关内容