The error=11
几乎可以肯定是EAGAIN
错误代码:
$ grep EAGAIN asm-generic/errno-base.h
#define EAGAIN 11 /* Try again */
The clone(2)
系统调用文档EAGAIN
错误返回:
EAGAIN Too many processes are already running.
The fork(2)
系统调用文件二EAGAIN
错误返回:
EAGAIN fork() cannot allocate sufficient memory to copy the
parent's page tables and allocate a task structure for
the child.
EAGAIN It was not possible to create a new process because
the caller's RLIMIT_NPROC resource limit was
encountered. To exceed this limit, the process must
have either the CAP_SYS_ADMIN or the CAP_SYS_RESOURCE
capability.
如果你的内存真的那么低,它几乎肯定会显示在系统日志中。查看dmesg(1)
输出或/var/log/syslog
有关系统内存不足的任何潜在消息。 (其他东西会损坏。这似乎不太合理。)
更有可能的是遇到每个用户的进程限制或系统范围的最大进程数。也许您的进程之一没有正确捕获僵尸?通过检查很容易发现这一点ps(1)
随着时间的推移输出:
while true ; do ps auxw >> ~/processes ; sleep 10 ; done
(也许每分钟或十分钟检查一次,如果确实需要几个小时才会遇到麻烦。)
如果您没有收获僵尸,那么请阅读您必须对 ProcessBuilder 执行的操作才能使用waitpid(2)
收割你死去的孩子。
如果您合法运行的进程数量超出了 rlimits 允许的数量,则需要使用ulimit
在你的bash(1)
脚本(如果运行为root
)或设置更高的限制/etc/security/limits.conf
为了nproc
财产。
如果您遇到系统范围的进程限制,则可能需要将更大的值写入/proc/sys/kernel/pid_max
. See proc(5)
一些(简短的)细节。