'exec():无法在Ubuntu 14.04.3 LTS上进行分叉

时间:2015-11-03 13:03:29

标签: php linux shell ubuntu ubuntu-14.04

我正在运行unittest脚本,对于测试用例设置,我需要不时运行shell命令。因此,在单元测试执行期间,shell命令运行大约50次。

它在CentOS 6.6版(最终版)服务器上运行正常,但在Ubuntu 14.04.3 LTS上不起作用。

问题是在大约20次shell脚本执行后,我收到以下错误:

exec(): Unable to fork [$(which mysql) -u user -ppwd test_db < "/opt/jenkins/workspace/some - project/application/../tests/Application/assets/sql/test_db.sql" 2> /dev/null]

我已经检查了互联网上的所有主题,没有人帮助过我。我增加了流程编号,打开文件限制为巨大值

# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 3885
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 100000
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 6553500
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

PHP报告类似的数字。 (文件test.php包含<?php echo system("ulimit -a");

# php test.php
time(seconds)        unlimited
file(blocks)         unlimited
data(kbytes)         unlimited
stack(kbytes)        8192
coredump(blocks)     0
memory(kbytes)       unlimited
locked memory(kbytes) 64
process              6553500
nofiles              100000
vmemory(kbytes)      unlimited
locks                unlimited
locks                unlimited

我从CLI运行脚本作为非root用户。

我已将php内存大小增加到2Gb

memory_limit => 2048M => 2048M

我尝试过使用system,passthrough,shel_exec,但没有区别。

PHP版本为5.6

PHP 5.6.14-1+deb.sury.org~trusty+1 (cli) 

有人知道如何解决问题吗?

2 个答案:

答案 0 :(得分:1)

我的案例中的问题非常简单,与我所做的配置更改无关。我认为保持我的经验是合理的,这样可以帮助其他开发人员避免同样的问题。

问题在于服务器上的内存不足。它是1Gb RAM的虚拟机。当脚本内存使用量大约为700Mb时,它会因“无法分叉”错误而失败。这很奇怪,听起来不像是记忆问题。

将服务器的内存大小增加到4Gb解决了这个问题。

答案 1 :(得分:1)

对于那些来到这里并遇到相同exec(): Unable to fork问题的人(并且它是一个广泛的问题),对我来说有用的只是一个简单的运行:

service php7.0-fpm restart
service nginx restart

将服务更改为您的PHP版本。显然,一些后台进程(在我的情况下排队工作人员)继续进行,而不是触发超时。这两个命令重置它们,事情再次正常。