web-dev-qa-db-ja.com

PHPスクリプトエラー 'exec():Unable to fork ...' on Ubuntu 14.04.3 LTS

Unittestスクリプトを実行していますが、テストケースのセットアップでは、シェルコマンドを時々実行する必要があります。その結果、ユニットテストの実行中にシェルコマンドが約50回実行されます。

CentOSリリース6.6(最終)サーバーでは問題なく動作しますが、Ubuntu 14.04.3LTSでは動作しません。

問題は、シェルスクリプトを約20回実行した後、次のエラーが発生することです。

_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) 
_

誰かが問題を解決する方法を知っていますか?

1
Stepashka

シェルからのphpまたはphpでApache/nginxを使用していますか?

いずれにせよ、問題はプロセスリークまたは使用されているメモリが多すぎる可能性があります。

サーバーに対してルートシェルを開いたままにして、別のシェル(またはブラウザー)からこの問題を再現してみることができます。

次に、それが再び発生した場合は、ルートシェルからのプロセスツリーeccを見て、私たちに知らせてください

1
Fredi