我继承了一个Perl脚本,根据计算机配置,该脚本在使用fork
调用$? == 11
时会失败。
根据errno.h
和various posts,11为EAGAIN
,即“重试”,因为某些资源暂时不可用。
是否有办法确定哪个资源导致派生失败,除了一对一地增加各种系统限制(open file descriptors,swap space,或allowable threads的数量)?
假设您的意思是$!
为EAGAIN
,我系统上的fork
手册页上说:
EAGAIN:fork()无法分配足够的内存来复制父级的页表并为子级分配任务结构。
EAGAIN:无法创建新进程,因为遇到了调用者的RLIMIT_NPROC资源限制。要超出此限制,该进程必须具有CAP_SYS_ADMIN或CAP_SYS_RESOURCE功能。
您是否要创建大量流程?完成后您正在收养孩子吗?
错误是由于用户的可用堆栈不足。检查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]#