2015-11-03 60 views
0

我正在運行單元測試腳本和測試用例設置我需要不時運行shell命令。因此在單元測試執行期間shell命令運行約50次。'exec():無法分叉'在Ubuntu 14.04.3 LTS

它在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非根用戶。

我增加PHP內存大小爲2Gb

memory_limit => 2048M => 2048M 

我試着使用系統,直通,shel_exec它使沒有區別。

PHP版本是5.6

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

是否有人知道如何解決這個問題?

+0

請問您可以在php內部運行'ulimit'命令:'echo system(「ulimit -a」);' – Kadir

+0

Beter在http://serverfault.com/社區提問有關服務器的問題。 – sidneydobber

+0

我已經將ulimit的輸出從PHP添加到問題中。一般來說 - 相同的數字。 – Stepashka

回答

0

在我的情況下,問題非常簡單,並且與我所做的配置更改無關。我認爲在這裏保留我的經驗是合理的,這樣可以幫助其他開發人員避免相同的問題。

問題在於服務器內存不足。它是1Gb RAM的虛擬機。當腳本內存使用量大約爲700Mb時,它開始因'無法分岔'錯誤而失敗。這很奇怪,聽起來不像內存問題。

將服務器的內存增加到4Gb可以解決問題。

1

對於任何人來到這裏,與同exec(): Unable to fork問題(這是一個廣義的),什麼工作對我來說是一個簡單的運行:

service php7.0-fpm restart 
service nginx restart 

更改到您的PHP版本的服務ofcourse。顯然,一些後臺進程(我的例子中的隊列工作者)一直在繼續,而不是觸發超時。這兩個命令重置它們,事情再次正常工作。

相關問題