我继承了一个Perl脚本,根据计算机配置,在使用fork
调用$? == 11
期间失败。
根据errno.h
和various posts,11是EAGAIN
,即“再试一次”,因为某些资源暂时无法使用。
有没有办法确定哪个资源导致fork失败, 除了逐个增加各种系统限制 (open file descriptors, swap space,或 allowable threads)的数量?
答案 0 :(得分:2)
假设您的意思是$!
是EAGAIN
,我系统上的fork
手册页说:
EAGAIN:fork()无法分配足够的内存来复制父页面表并为子节点分配任务结构。
EAGAIN:由于遇到调用方的RLIMIT_NPROC资源限制,因此无法创建新进程。要超过此限制,进程必须具有CAP_SYS_ADMIN或CAP_SYS_RESOURCE功能。
您是否正在尝试创建大量流程?你这些孩子完成后会收割它们吗?
答案 1 :(得分:0)
该错误是由于用户的可用堆栈用完了。
检查RHEL服务器上的安全配置文件
[root@server1 webapps]# cat /etc/security/limits.d/90-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 1024
root soft nproc unlimited
[root@server1 webapps]# vi /etc/security/limits.d/90-nproc.conf
[root@server1 webapps]#
在我的情况下,“测试”用户收到消息“ -bash:fork:重试:资源暂时不可用”
通过添加用户特定的堆栈限制来解决此问题
[root@server1 webapps]# vi/etc/security/limits.d/90-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 1024
test soft nproc 16384
root soft nproc unlimited
[root@server1 webapps]#