我最近在 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 位后,这些消息大多消失了。